9

各チャネルで最低価格のアイテムを取得するために、次のリストを照会するためのラムダ式を作成するのに助けが必要です。つまり、この例のアイテム A、D、および G

class Radio
{
    public string Name { get; set; }
    public int Channel { get; set; }
    public decimal Price { get; set; }
}

List<Radio> radios = new List<Radio>();
radios.Add(new Radio() { Name = "A", Channel = 1, Price = 10 });
radios.Add(new Radio() { Name = "B", Channel = 1, Price = 20 });
radios.Add(new Radio() { Name = "C", Channel = 1, Price = 30 });
radios.Add(new Radio() { Name = "D", Channel = 2, Price = 10 });
radios.Add(new Radio() { Name = "E", Channel = 2, Price = 20 });
radios.Add(new Radio() { Name = "F", Channel = 2, Price = 30 });
radios.Add(new Radio() { Name = "G", Channel = 3, Price = 10 });
radios.Add(new Radio() { Name = "H", Channel = 3, Price = 20 });
radios.Add(new Radio() { Name = "I", Channel = 3, Price = 30 });
4

2 に答える 2

18

Linqを使用して、

Enumerable.GroupBy を使用して最初にグループ化し、次にEnumerable.OrderByを使用し
並べ替え、次にグループ内の並べ替えられた各項目の最初を 取る

    radios.GroupBy(x=> x.Channel).Select(x=>x.OrderBy(y=>y.Price)).Select(x=>x.First());
于 2012-11-30T11:21:37.523 に答える
14

各グループで高価な並べ替えを行うことなく、これを行うこともできます。

radios.GroupBy(x => x.Channel).Select(g =>
    g.Aggregate((r1, r2) => r1.Price < r2.Price ? r1 : r2));

Aggregate各グループを 1 回反復し、これまでに見つかった最も安いラジオを追跡し、より安いラジオが見つかった場合はそれを置き換えます。

于 2012-11-30T11:57:48.980 に答える