LINQ GroupBy x, где больше одного x и y является уникальным

Пусть есть такие объекты:

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

var bar = new List {
 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 - другое.

Это даст мне foos, где x - то же самое, и больше одного.

 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 - то же самое?

<�Сильный> UPDATE

С 3999996 объектами в баре все три из них работают правильно.

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
2
добавлено отредактировано
Просмотры: 2
nl ja de
Сделайте Distinct on y .
добавлено автор Grant Thomas, источник

2 ответы

Где-то там!

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

g.Select(f => f.y).Distinct().Count() says "get all the y values from the foos in the group, throw away any duplicates, and then count them".

Edit: .Skip(1).Any() is better than .Count() > 1 because it stops looking as soon as it finds a second item, ratehr than finding a million and then going a million > 1. Usually I get that right first time...

(Обратите внимание, что ваш результат не является списком foo s, это список групп foo s, где каждая группа имеет константу x .)

4
добавлено

Попробуй это:

bar
  .GroupBy(a => a.x)
  .Where(a => a.Count() > 1 && a.Any(b=>b.y != a.First().y))
  .ToList();
1
добавлено
Ваше решение работает, но Rawling просто немного быстрее. В среднем 30 мс.
добавлено автор NitroxDM, источник