gpt4 book ai didi

c# - LINQ GroupBy x 其中不止一个 x 且 y 是唯一的

转载 作者:行者123 更新时间:2023-12-02 22:17:22 24 4
gpt4 key购买 nike

假设有这样一个对象:

class foo
{
public String x{ get; set; }
public String y{ get; set; }
}

var bar = new List<foo> {
new foo{ x= "u", y= "w"},
new foo{ x= "s", y= "q"},
new foo{ x= "u", y= "r" },
new foo{ x= "1", y= "0" },
new foo{ x= "1", y= "0" },
};

我想将这些分组,其中 x 相同但 y 不同。

这将使我得到 x 相同且不止一个的 foos。

 bar.GroupBy(x => x.x).Where(x => x.Count() > 1).ToList();

这是我得到的:

foo{ x= "u", y= "w"}
foo{ x= "u", y= "r" }
foo{ x= "1", y= "0" }
foo{ x= "1", y= "0" }

这是我想要得到的:

foo{ x= "u", y= "w"}
foo{ x= "u", y= "r" }

那么如何过滤掉y相同的那些呢?

更新

对于 bar 中的 3,999,996 个对象,所有这三个都可以正常工作。

bar.GroupBy(f => f.x).Where(a => a.Select(f => f.y).Distinct().Skip(1).Any()).ToList(); // Elapsed ms = 702,715,779,666 AVG = 715
bar.GroupBy(f => f.x).Where(a => a.Count() > 1 && a.Any(b => b.y!= a.First().y)).ToList(); // Elapsed ms = 753,701,728,749 AVG = 732
bar.GroupBy(f => f.x).Where(a => a.Skip(1).Any() && a.Any(b => b.y!= a.First().y)).ToList(); // Elapsed ms = 734,751,758,745 AVG = 747

最佳答案

快到了!

bar.GroupBy(f => f.x)
.Where(g => g.Select(f => f.y).Distinct().Skip(1).Any())
.ToList();

g.Select(f => f.y).Distinct().Count() 表示“从 foo 中获取所有 y 值> 组中的 s,丢弃所有重复项,然后然后数一数。

编辑:.Skip(1).Any() 优于 .Count() > 1 因为它会尽快停止查找当它找到第二个项目时,速度比找到一百万然后去 a million > 1 快。通常我第一次就做对了......

(请注意,您的结果不是 foo 的列表,它是 foo 组的列表,其中每个组都有一个常量 x.)

关于c# - LINQ GroupBy x 其中不止一个 x 且 y 是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14238585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com