Это вопрос, который я недавно опубликовал. Я получил ответ, но я понял, что упростил свой примерный класс до такой степени, что потерял первоначальное намерение. Уже приняв ответ на исходный вопрос, я подумал, что лучше начать другой.Запрос LINQ, чтобы вернуть самый ценный товар в каждой категории
Итак, вот мой новый класс:
public class Art
{
public string Type { get; set; }
public string Name { get; set; }
public int Price { get; set; }
}
... и вот создание списка:
public static void Example0000()
{
List<Art> art = new List<Art>();
art.Add(new Art() { Price = 45, Type = "painting", Name = "Still Life in Maryland" });
art.Add(new Art() { Price = 123, Type = "sculpture", Name = "Dying Sheep" });
art.Add(new Art() { Price = 12, Type = "icon", Name = "Perplexed Smiley" });
art.Add(new Art() { Price = 460, Type = "sculpture", Name = "Waves on Sand" });
art.Add(new Art() { Price = 2030, Type = "painting", Name = "Robert in the Morning" });
art.Add(new Art() { Price = 10, Type = "icon", Name = "Smiley Picking Nose" });
art.Add(new Art() { Price = 700, Type = "painting", Name = "Birds in Autumn" });
art.Add(new Art() { Price = 1400, Type = "sculpture", Name = "Holding Hands" });
art.Add(new Art() { Price = 46, Type = "painting", Name = "Reeling Him In" });
art.Add(new Art() { Price = 12000, Type = "sculpture", Name = "Old Dog" });
art.Add(new Art() { Price = 6, Type = "icon", Name = "Hiding Smiley" });
art.Add(new Art() { Price = 810, Type = "sculpture", Name = "Rhinestone Cowgirl" });
art.Add(new Art() { Price = 250, Type = "painting", Name = "Upstairs, Downstairs" });
art.Add(new Art() { Price = 3, Type = "icon", Name = "Dopey Smiley" });
art.Add(new Art() { Price = 1000, Type = "painting", Name = "Young Love" });
art.Add(new Art() { Price = 260, Type = "sculpture", Name = "Taking a Spill" });
}
То, что я хочу, чтобы это коллекция объектов, один для каждого типа, которые имеют три свойства; ArtType, ArtName и MostExpensivePrice. Для каждого типа я хочу имя и цену для самого дорогого объекта этого типа.
Так что мой список должен выглядеть следующим образом:
painting______Robert_in_the_Morning______2030
sculpture_____Old Dog__________________12000
icon_________Perplexed Smiley______________12
Что бы LINQ выглядеть для этого? Пример, который я начинаю, выглядит следующим образом:
var categories4 =
from a in art
group a by a.Type into g
let maxPrice = g.Max(p => p.Price)
select new { ArtType = g.Key, MostExpensive = g.Where(a => a.Price == maxPrice) };
Это хорошее понимание, это немного компромисс между читабельностью и производительностью. Тем не менее, это не мешает вам использовать метод расширения, который использует 'Aggregate' внутри, но обеспечивает читаемость, которую может предоставить Max. (например, метод расширения [MaxBy] (https://code.google.com/p/morelinq/source/browse/MoreLinq/MaxBy.cs)) – AtinSkrita
Здесь было много хороших ответов, и было очень сложно должны выбрать только один. Это лучше всего отвечало духу того, что я пытался создать; коллекция объектов на лету, содержащая информацию из выбранного набора объектов Art. –