使用Linq执行此操作的最佳方式是什么?
我有一个包含两个属性的List:Number和Percentage。
有时在列表中有重复的数字:
-----------------------------
Number: 182 | Percentage: 15%
Number: 182 | Percentage: 70%
...
当找到重复的数字时,我想选择具有两个百分比值中最低值的对象,并将这些结果传输到新的列表中。
答案 0 :(得分:4)
var query = from x in list
group x by x.Number into x
select x.OrderBy(y => y.Percentage).First();
答案 1 :(得分:4)
尝试以下
var list = originalList
.GroupBy(x => x.Number)
.Select(x => x.OrderBy(y => y.Percentage).First())
.ToList();
此查询将首先按Number
值对项目进行分组。然后它将按百分比对每个组进行排序,并选出第一个元素(最低)。
答案 2 :(得分:3)
这会有用吗?
collection.GroupBy(item => item.Number).Select(group => group.Min())
答案 3 :(得分:1)
var query = (from l in lst
group l by l.Number into g
select g.Min(x => x.Percentage)).ToList();
答案 4 :(得分:1)
根据" 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语言转换中没有解决方案,要么最终解决方案不会是IMHO点语法为此问题提供的干净解决方案。查询理解通常可以使事情变得更简单,但在这种情况下,我更喜欢点语法:
var query =
list.GroupBy(i => i.Number)
.Select(gj => gj.OrderBy(i => i.Percentage).First());
gj.OrderBy(...).First()
部分完成了更多LINQ风格的MinBy操作(参见Jon Skeet's post)