C#-当发现重复密钥时,从两个值中选择最低值
本文关键字:两个 最低值 选择 发现 密钥 C#- | 更新日期: 2023-09-27 18:29:01
使用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
值对项目进行分组。然后,它将按百分比对每组进行排序,并选择第一个元素(最低的)。
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语言转换中没有解决方案,要么你最终得到的解决方案将不是IMHO点语法为这个问题提供的干净的解决方案。查询理解通常可以使事情变得更简单,但在这种情况下,我更喜欢点语法:
var query =
list.GroupBy(i => i.Number)
.Select(gj => gj.OrderBy(i => i.Percentage).First());
gj.OrderBy(...).First()
部分完成了更LINQ风格的MinBy操作(请参阅Jon Skeet的文章)