【发布时间】:2012-03-27 23:40:09
【问题描述】:
使用 Linq 执行此操作的最佳方法是什么?
我有一个包含两个属性的列表:数字和百分比。
有时列表中有重复的数字:
-----------------------------
Number: 182 | Percentage: 15%
Number: 182 | Percentage: 70%
...
当发现重复的数字时,我想选择两个百分比值中最低的对象并将这些结果转移到一个新的列表中。
【问题讨论】:
使用 Linq 执行此操作的最佳方法是什么?
我有一个包含两个属性的列表:数字和百分比。
有时列表中有重复的数字:
-----------------------------
Number: 182 | Percentage: 15%
Number: 182 | Percentage: 70%
...
当发现重复的数字时,我想选择两个百分比值中最低的对象并将这些结果转移到一个新的列表中。
【问题讨论】:
试试下面的
var list = originalList
.GroupBy(x => x.Number)
.Select(x => x.OrderBy(y => y.Percentage).First())
.ToList();
此查询将首先按 Number 值对项目进行分组。然后它将按百分比对每个组进行排序并选择第一个元素(最低的)。
【讨论】:
OrderBy
var query = from x in list
group x by x.Number into x
select x.OrderBy(y => y.Percentage).First();
【讨论】:
这行得通吗?
collection.GroupBy(item => item.Number).Select(group => group.Min())
【讨论】:
var query = (from l in lst
group l by l.Number into g
select g.Min(x => x.Percentage)).ToList();
【讨论】:
根据“LINQ”发布者需要查询理解语法而不是点语法的解释来改变这一点(否则其他响应就足够了):
var query =
from i in list
group i by i.Number into gj
select gj.OrderBy(x => x.Percentage).First();
但这仍然使用大量的点语法进行排序。其功能相当于:
var query =
from i in list
group i by i.Number into gj
select
(from i in gj
orderby i.Percentage
select i).First();
如果您不喜欢最后的 .First() 调用,那将是一个挑战,要么在 LINQ 语言转换中没有解决方案,要么您最终得到的解决方案不是干净的解决方案恕我直言点语法提供了这个问题。查询理解通常可以使事情变得更简单,但在这种情况下,我更喜欢点语法:
var query =
list.GroupBy(i => i.Number)
.Select(gj => gj.OrderBy(i => i.Percentage).First());
gj.OrderBy(...).First() 部分完成了更多 LINQ 样式的 MinBy 操作(请参阅 Jon Skeet's post)
【讨论】: