Попытка найти 3 верхних свойства экземпляра POCO - PullRequest
0 голосов
/ 30 июля 2009

У меня есть простой класс POCO, который содержит оценки студента.

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

Есть ли способ (используя LINQ ?), Чтобы я мог определить 3 верхних свойства, упорядоченных по счету?

Я предполагаю, что конечным объектом будет IList анонимного типа, который будет иметь два поля.

  1. Наименование (наименование имущества)
  2. Оценка (десятичное значение).

Количество свойств в объекте конечно:)

Есть предложения?

Как альтернативный ответ, можно ли вместо этого сделать это в базе данных?

Ответы [ 4 ]

3 голосов
/ 30 июля 2009

Вы ищете что-то подобное?

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);
    }
}
1 голос
/ 30 июля 2009

Было бы проще использовать словарь с темой в качестве ключа и счетом в качестве значения:

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);
}
1 голос
/ 30 июля 2009

Если у вас уже нет всех данных в памяти, более эффективно позволить базе данных выбрать правильные данные для вас.

Если вы храните оценки в виде полей в базе данных, вы должны нормализовать их, чтобы сделать возможным запрос. Лучше всего перепроектировать базу данных и поместить оценки в виде строк в отдельной таблице. Данные должны быть в полях таблиц, а не в именах полей:

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
0 голосов
/ 30 июля 2009

В вашем вопросе неясно, являются ли все оценки отдельными свойствами или это какой-то список. Если это список, это будет работать:

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