2

次のようなオブジェクトがあるとします。

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 個のオブジェクトがある場合、これら 3 つすべてが正しく機能します。

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
4

2 に答える 2