編輯:好的,現在我們已經有了一個清晰的略微組需求(雖然還遠未明確的書面)最簡單的方法很可能是:
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();
你不應該限制自己要麼查詢表達式或擴展方法版本 - 理解這兩者很重要,所以你可以使用任何最合適的。
您還沒有表達清楚你的問題在所有。 *爲什麼*你會期望結果是6和87?爲什麼當每行有不同的id1時,通過id1進行分組?如果你用id2進行分組會更有意義,但結果應該是12和87,而不是6和87.請花一些時間讓你的問題清楚。 – 2013-04-07 18:28:40
但是'6 <12'和'87> 8';請解釋。 – 2013-04-07 18:28:59
我想他希望按id2分組,並從每個組中選擇最大值 – 2013-04-07 18:30:31