代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

尝试查找POCO实例的前3个属性

  •  -1
  • Pure.Krome  · 技术社区  · 15 年前

    我有一个简单的包含学生分数的POCO课程。

    For example:
    Math - 83%
    Engrish - 82%
    Chemistry - 81%
    Drama - 100%
    etc..
    

    有什么方法(使用 LINQ ?)我能找出按分数排序的前三个属性吗?

    我假设最后一个对象是匿名类型的ilist<t>,它有两个字段。

    1. 名称(属性名称)
    2. 分数(十进制值)。

    但是,对象中的属性数量是有限的:)

    有什么建议吗?

    作为一个替代答案,这可以在数据库中完成吗?

    4 回复  |  直到 8 年前
        1
  •  3
  •   maciejkow    15 年前

    你在找这样的东西吗?

    class Notes
    {
        public double Math{ get; set; }
        public double English { get; set; }
        public double Chemistry { get; set; }
        public double Drama { get; set; }
        public string IgnoreMePlease { get; set; }
    }
    
    class Program
    {
        static void PrintHighestNotes(Notes notes)
        {
            var pairs = from property in notes.GetType().GetProperties()
                         where property.PropertyType == typeof (double)
                         select new
                                {
                                    Name = property.Name,
                                    Value = (double) property.GetValue(notes, null)
                                };
            var result = pairs.OrderByDescending(pair => pair.Value);
    
            foreach (var pair in result)
                Console.WriteLine("{0} = {1}", pair.Name, pair.Value);
        }
    
        static void Main(string[] args)
        {
            Notes notes = new Notes()
                          {
                              Chemistry = 0.10,
                              Math = 0.2,
                              Drama = 1,
                              English = 0.3,
                              IgnoreMePlease = "Ignore"
                          };
            PrintHighestNotes(notes);
        }
    }
    
        2
  •  1
  •   Guffa    15 年前

    除非您正好在内存中拥有所有数据,否则让数据库为您选择正确的数据会更有效。

    如果将成绩存储为数据库中的字段,则必须使其正常化,以便查询。最好的方法是重新设计数据库,并将成绩作为行放在单独的表中。数据应该在表的字段中,而不是作为字段名:

    select top 3 GradeName, Grade
    from Grades
    where StudentId = 42
    order by Grade desc
    

    您也可以在运行中使数据正常化,但这当然没有那么有效:

    select top 3 GradeName, Grade
    from (
       select GradeName = 'Engrish', Grade = Engrish from Students where StudentId = 42
       union all
       select 'Drama', Drama from Students where StudentId = 42
       union all
       select 'Math', Math from Students where StudentId = 42
       union all
       select 'Chemistry', Chemistry from Students where StudentId = 42
    ) Grades
    order by Grade desc
    
        3
  •  1
  •   Peter Mortensen TravisEz13    8 年前

    使用主题为键、分数为值的字典会更简单:

    Dictionary<string, int> scores = new Dictionary<string, int>();
    ...
    
    var top3Subjects = (from s in scores
                        orderby s.Value descending
                        select s).Take(3);
    

    返回一个 IEnumerable<KeyValuePair<string, int>> ,您可以这样使用:

    foreach (var s in top3Subjects)
    {
        Console.WriteLine("{0} : {1}", s.Key, s.Value);
    }
    
        4
  •  0
  •   Jon Galloway    15 年前

    在你的问题中,不清楚分数是否都是独立的属性,或者它们是否是某种列表。如果它们是一个列表,那么这将起作用:

     var topScores =
        (from s in Scores
        orderby s.Score descending
        select new { s.Name, s.Score}).Take(3);
    
    推荐文章