在LINQ Lambda表达式中使用GroupBy和Max

Pav*_*vel 8 linq lambda select group-by max

我有一个集合,例如:

**id1, id2, value**
   1    9    12
   2    9     6
   3    11    8
   4    11   87
Run Code Online (Sandbox Code Playgroud)

我想使用LINQ并获得以下结果:

**value**
   6
   87
Run Code Online (Sandbox Code Playgroud)

PS

id1 - select MAX;
id2 - group column;
Run Code Online (Sandbox Code Playgroud)

我需要一个答案的形式

var result = list.GroupBy(x=>x.id2).select(s=>s.value);
Run Code Online (Sandbox Code Playgroud)

我希望得到你的帮助.

Jon*_*eet 26

编辑:好的,现在我们有一个更清晰的要求(尽管仍然没有写清楚),最简单的方法可能是:

var maxes = list.GroupBy(x => x.id2,
                         (key, xs) => xs.OrderByDescending(x => x.id1)
                                        .First()
                                        .value);
Run Code Online (Sandbox Code Playgroud)

不幸的是,LINQ没有提供一种简单的方法来获取"具有最大值的元素"(而不是最大值本身).我在MoreLINQ中有一个方法可以做到这一点,称为MaxBy:

var maxes = list.GroupBy(x => x.id2,
                         (key, xs) => xs.MaxBy(x => x.id2).value);
Run Code Online (Sandbox Code Playgroud)

原始答案(按id2分组,取最大值)

我正在回答假设你实际上打算分组id2而不是id1,你实际上想要12和87而不是6和87的结果.在这种情况下,你需要:

var maxes = list.GroupBy(x => x.id2, (id, xs) => xs.Max(x => x.value));
Run Code Online (Sandbox Code Playgroud)

或者(可能更容易理解):

var maxes = list.GroupBy(x => x.id2)
                .Select(xs => xs.Max(x => x.value));
Run Code Online (Sandbox Code Playgroud)

要么:

var maxes = list.GroupBy(x => x.id2, x => x.value)
                .Select(values => values.Max());
Run Code Online (Sandbox Code Playgroud)

要么:

var maxes = list.GroupBy(x => x.id2,     // Key selector
                         x => x.value,   // Element selector
                         (key, values) => values.Max()); // Result selector
Run Code Online (Sandbox Code Playgroud)

甚至:

var maxes = list.GroupBy(x => x.id2)
                .Select(xs => xs.Select(x => x.value).Max());
Run Code Online (Sandbox Code Playgroud)

如你所见,GroupBy有很多重载:)

或者您可以使用查询表达式:

var maxes = from x in list
            group x.value by x.id2 into values
            select values.Max();
Run Code Online (Sandbox Code Playgroud)

你不应该限制自己无论是查询表达式或扩展方法的版本-了解双方是很重要的,所以你可以使用任何的最合适的.


Jul*_*ano 6

显然 OP 想要Value最大Id1范围内Id2

样本数据:

public class Row
{
    public int Id1;
    public int Id2;
    public int Value;
}

List<Row> rows = new List<Row>(){
    new Row(){Id1=1,Id2=9,Value=12},
    new Row(){Id1=2,Id2=9,Value=6},
    new Row(){Id1=3,Id2=11,Value=8},
    new Row(){Id1=4,Id2=11,Value=87}
};
Run Code Online (Sandbox Code Playgroud)

解决方案:

List<int> res = rows.GroupBy(r => r.Id2)
                    .Select(g => g.OrderByDescending(i=>i.Id1).First().Value)
                    .ToList();
Run Code Online (Sandbox Code Playgroud)