假设有一个像这样的对象:
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