Если вы используете LINQ, вы можете использовать следующий запрос:
var duplicateItems = from x in list
group x by x into grouped
where grouped.Count() > 1
select grouped.Key;
или, если вы предпочитаете без синтаксического сахара:
var duplicateItems = list.GroupBy(x => x).Where(x => x.Count() > 1).Select(x => x.Key);
Это группирует все элементы, которыеодинаковы, а затем фильтры только для тех групп с более чем одним элементом.Наконец, он выбирает только ключ из этих групп, поскольку вам не нужен счетчик.
Если вы предпочитаете не использовать LINQ, вы можете использовать этот метод расширения:
public void SomeMethod {
var duplicateItems = list.GetDuplicates();
…
}
public static IEnumerable<T> GetDuplicates<T>(this IEnumerable<T> source) {
HashSet<T> itemsSeen = new HashSet<T>();
HashSet<T> itemsYielded = new HashSet<T>();
foreach (T item in source) {
if (!itemsSeen.Add(item)) {
if (itemsYielded.Add(item)) {
yield return item;
}
}
}
}
Это отслеживает предметы, которые он видел и дал.Если он не видел предмет раньше, он добавляет его в список увиденных предметов, в противном случае он игнорирует его.Если он не давал предмета раньше, он возвращает его, в противном случае он игнорирует его.