Используйте группу по материалам, производительность этих методов достаточно хорошая. Беспокойство вызывает только большой объем памяти, если вы работаете с большими наборами данных.
from g in (from x in data group x by x)
where g.Count() > 1
select g.Key;
- ИЛИ если вы предпочитаете методы расширения
data.GroupBy(x => x)
.Where(x => x.Count() > 1)
.Select(x => x.Key)
Где Count() == 1
это ваши отличительные элементы, а где Count() > 1
это один или несколько дубликатов.
Поскольку LINQ довольно ленив, если вы не хотите пересматривать свои вычисления, вы можете сделать это:
var g = (from x in data group x by x).ToList(); // grouping result
// duplicates
from x in g
where x.Count() > 1
select x.Key;
// distinct
from x in g
where x.Count() == 1
select x.Key;
При создании группировки будет создан набор наборов. Предполагая, что это набор со вставкой O(1)
, время выполнения группы при заходе на посадку составляет O(n)
. Затраты на каждую операцию несколько высоки, но они должны быть равны почти линейным показателям.