8

我有一个集合,例如:

**id1, id2, value**
   1    9    12
   2    9     6
   3    11    8
   4    11   87

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

**value**
   6
   87

附言

id1 - select MAX;
id2 - group column;

我需要以下形式的答案

var result = list.GroupBy(x=>x.id2).select(s=>s.value);

我希望能得到你的帮助。

4

3 回答 3

27

编辑:好的,现在我们有了更清晰的一组要求(尽管还远未写清楚),最简单的方法可能是:

var maxes = list.GroupBy(x => x.id2,
                         (key, xs) => xs.OrderByDescending(x => x.id1)
                                        .First()
                                        .value);

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

var maxes = list.GroupBy(x => x.id2,
                         (key, xs) => xs.MaxBy(x => x.id2).value);

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

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

var maxes = list.GroupBy(x => x.id2, (id, xs) => xs.Max(x => x.value));

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

var maxes = list.GroupBy(x => x.id2)
                .Select(xs => xs.Max(x => x.value));

或者:

var maxes = list.GroupBy(x => x.id2, x => x.value)
                .Select(values => values.Max());

或者:

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

甚至:

var maxes = list.GroupBy(x => x.id2)
                .Select(xs => xs.Select(x => x.value).Max());

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

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

var maxes = from x in list
            group x.value by x.id2 into values
            select values.Max();

您不应该将自己限制查询表达式或扩展方法版本 - 了解两者很重要,因此您可以使用最合适的任何内容。

于 2013-04-07T18:30:21.153 回答
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}
};

解决方案:

List<int> res = rows.GroupBy(r => r.Id2)
                    .Select(g => g.OrderByDescending(i=>i.Id1).First().Value)
                    .ToList();
于 2013-04-07T22:53:25.723 回答
0

万一它对其他人有帮助,我遇到了类似的情况,除了需要返回多条记录而不是一条记录。

例如。

**id1, id2, value**
   1    9    12
   2    9     6 <-
   2    9     7 <-
   3    11    8
   4    11   87 <-
   4    11   88 <-

以下将上述四条记录作为两个记录的两个列表(可枚举的枚举)返回:

 var maxes = from x in list
            group x by x.id2 into xs
            select new {values = xs.Where(x => x.id1 == xs.Max(y => y.id1))};

或者

 var maxes = list.GroupBy(x => x.id2,
            (key, xs) => new
            {
                values = xs.Where(x => x.id1 == xs.Max(y => y.id1))
            });
于 2016-08-31T14:56:37.147 回答