Для чего бы это ни стоило, я только что сравнил два метода, с которыми мы столкнулись в этой теме. Сначала я определил вспомогательный класс:
public class Foo
{
public int ID;
}
... а затем составили большой список экземпляров со случайным идентификатором:
var list = new List<Foo>();
var r = new Random();
for (int i = 0; i < 10000; i++) list.Add(new Foo { ID = r.Next() });
... и, наконец, рассчитал код:
var sw = new Stopwatch();
sw.Start();
bool b = list.Any(i => list.Where(j => i != j).Any(j => j.ID == i.ID));
Console.WriteLine(b);
Console.WriteLine(sw.ElapsedTicks);
sw.Reset();
sw.Start();
b = (list.GroupBy(i => i.ID).Count() != list.Count);
Console.WriteLine(b);
Console.WriteLine(sw.ElapsedTicks);
Вот один из выводов:
Ложная
59392129
Ложная
168151
Так что я думаю, что можно с уверенностью сказать, что группировка, а затем сравнение количества групп с количеством элементов - это путь на путь быстрее, чем сравнение методом "вложенной Любой" методом грубой силы.