Используя LINQ, List<int>
как я могу получить список, содержащий записи, повторенные более одного раза, и их значения?
linq
list
duplicate-removal
Мирко Arcese
источник
источник
code
for (int i = 0; i <duplicates.Count; i ++) {int duplicate = duplicates [i]; duplicatesLocation.Add (duplicate, new List <int> ()); for (int k = 0; k <hitList.Length; k ++) {if (hitList [k] .Contains (duplicate)) {duplicatesLocation.ElementAt (i) .Value.Add (k); }} // удаляем дубликаты по некоторым правилам. }code
Выясните, есть ли в перечислимом дубликат :
Узнайте, являются ли все значения в перечислимом уникальными :
источник
Другой способ использует
HashSet
:Если вы хотите уникальные значения в вашем списке дубликатов:
Вот то же решение, что и у общего метода расширения:
источник
List<int> { 1, 2, 3, 4, 5, 2 }
в качестве источника, результат будетIEnumerable<int>
с одним элементом, имеющим значение1
(где правильное значение дубликата равно 2)Console.WriteLine("Count: {0}", duplicates.Count());
прямо под ней, и она печатает6
. Если я не пропущу что-то о требованиях для этой функции, в итоговой коллекции должен быть только 1 элемент.ToList
, чтобы исправить проблему, но это означает, что метод выполняется сразу после его вызова, а не когда вы перебираете результаты.var hash = new HashSet<int>();
var duplicates = list.Where(i => !hash.Add(i));
приведет к списку, который включает в себя все вхождения дубликатов. Таким образом, если у вас есть четыре вхождения 2 в вашем списке, то ваш дубликат списка будет содержать три вхождения 2, так как только один из 2 может быть добавлен в HashSet. Если вы хотите, чтобы ваш список содержал уникальные значения для каждого дубликата, используйте вместо этого код:var duplicates = mylist.Where(item => !myhash.Add(item)).ToList().Distinct().ToList();
Ты можешь сделать это:
С этими методами расширения:
Использование IsMultiple () в методе Duplicates быстрее, чем Count (), потому что это не выполняет итерацию всей коллекции.
источник
Count()
он предварительно рассчитан, и ваше решение, вероятно, медленнее.Count()
] в основном отличается от итерации всего списка.Count()
предварительно вычисляется, но перебирает весь список нет.Я создал расширение для ответа на это, вы можете включить его в свои проекты, я думаю, что это возвращает большинство случаев, когда вы ищете дубликаты в List или Linq.
Пример:
источник
Чтобы найти только повторяющиеся значения:
Например. var list = new [] {1,2,3,1,4,2};
поэтому group by сгруппирует числа по их ключам и будет вести подсчет (количество повторений) вместе с ним. После этого мы просто проверяем значения, которые повторялись более одного раза.
Чтобы найти только уникальные значения:
Например. var list = new [] {1,2,3,1,4,2};
поэтому group by сгруппирует числа по их ключам и будет вести подсчет (количество повторений) вместе с ним. После этого мы просто проверяем значения, которые повторяются только один раз, значит уникальны.
источник
var unique = list.Distinct(x => x)
Полный набор расширений Linq to SQL для функций Duplicates, проверенных в MS SQL Server. Без использования .ToList () или IEnumerable. Эти запросы выполняются в SQL Server, а не в памяти. , Результаты возвращаются только в память.
источник
ответ есть но я не понял почему не работает;
мое решение такое в этой ситуации;
источник