Если вы не занимаетесь чем-то серьезным, возможно, вам подойдет следующий простой код:
var lists = new List<List<int>>()
{
new List<int>() {0 ,1, 2, 3, 4, 5, 6 },
new List<int>() {0 ,1, 2, 3, 4, 5, 6 },
new List<int>() {0 ,1, 4, 2, 4, 5, 6 },
new List<int>() {0 ,3, 2, 5, 1, 6, 4 }
};
var duplicates = from list in lists
where lists.Except(new[] { list }).Any(l => l.SequenceEqual(list))
select list;
Очевидно, что вы могли бы получить более высокую производительность, если бы вручную настраивали алгоритм так, чтобы вам не приходилось сканировать списки на каждой итерации, но есть что-то, что нужно сказать для написания декларативного, более простого кода.
(Кроме того, благодаря Awesomeness из LINQ®, добавив вызов .AsParallel () к приведенному выше коду, алгоритм будет работать на нескольких ядрах, и, следовательно, работать потенциально быстрее, чем сложные, отрегулированные вручную решения, упомянутые в этом нить.)