Najprostszym sposobem rozwiązania problemu jest zgrupowanie elementów na podstawie ich wartości, a następnie wybranie przedstawiciela grupy, jeśli w grupie jest więcej niż jeden element. W LINQ oznacza to:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => y.Key)
.ToList();
Jeśli chcesz wiedzieć, ile razy elementy się powtarzają, możesz użyć:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => new { Element = y.Key, Counter = y.Count() })
.ToList();
Zwróci List
to anonimowy typ, a każdy element będzie miał właściwości Element
i Counter
, aby pobrać potrzebne informacje.
I na koniec, jeśli szukasz słownika, możesz go użyć
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
Zwróci to słownik z twoim elementem jako kluczem i liczbą powtórzeń jako wartości.
code
for (int i = 0; i <duplicates.Count; i ++) {int duplicate = duplicates [i]; duplicatesLocation.Add (duplikat, nowa lista <int> ()); for (int k = 0; k <hitsList.Length; k ++) {if (hitsList [k] .Contains (duplicate)) {duplicatesLocation.ElementAt (i) .Value.Add (k); }} // usuń duplikaty zgodnie z niektórymi regułami. }code
Sprawdź, czy wyliczalny zawiera duplikat :
Sprawdź, czy wszystkie wartości w wyliczalnych są unikalne :
źródło
Innym sposobem jest użycie
HashSet
:Jeśli chcesz mieć unikalne wartości na liście duplikatów:
Oto to samo rozwiązanie, co ogólna metoda rozszerzenia:
źródło
List<int> { 1, 2, 3, 4, 5, 2 }
jako źródło, wynikiem jestIEnumerable<int>
jeden element o wartości1
(gdzie poprawna zduplikowana wartość to 2)Console.WriteLine("Count: {0}", duplicates.Count());
bezpośrednio pod nią i drukuje6
. O ile nie brakuje mi czegoś na temat wymagań dla tej funkcji, w wynikowej kolekcji powinna znajdować się tylko 1 pozycja.ToList
w celu rozwiązania problemu, ale oznacza to, że metoda jest wykonywana natychmiast po jej wywołaniu, a nie podczas iteracji wyników.var hash = new HashSet<int>();
var duplicates = list.Where(i => !hash.Add(i));
doprowadzi do listy obejmującej wszystkie wystąpienia duplikatów. Jeśli więc masz cztery wystąpienia 2 na liście, twoja zduplikowana lista będzie zawierać trzy wystąpienia 2, ponieważ tylko jeden z 2 może zostać dodany do zestawu HashSet. Jeśli chcesz, aby twoja lista zawierała unikalne wartości dla każdego duplikatu, użyj tego kodu zamiast:var duplicates = mylist.Where(item => !myhash.Add(item)).ToList().Distinct().ToList();
Możesz to zrobić:
Dzięki tym metodom rozszerzenia:
Użycie IsMultiple () w metodzie Duplicates jest szybsze niż Count (), ponieważ nie iteruje całej kolekcji.
źródło
Count()
jest ono wstępnie obliczone, a twoje rozwiązanie prawdopodobnie jest wolniejsze.Count()
] zasadniczo różni się od iteracji całej listy.Count()
jest wstępnie obliczony, ale iteracja całej listy nie.Stworzyłem rozszerzenie odpowiedzi na to, które możesz uwzględnić w swoich projektach, myślę, że to zwraca najwięcej w przypadku wyszukiwania duplikatów w List lub Linq.
Przykład:
źródło
Aby znaleźć tylko zduplikowane wartości:
Na przykład. var list = new [] {1,2,3,1,4,2};
więc pogrupuj według, pogrupuje liczby według ich kluczy i zachowa z nim liczbę (liczbę powtórzeń). Następnie sprawdzamy tylko wartości, które powtórzyły się więcej niż jeden raz.
Aby znaleźć tylko wartości uniuqe:
Na przykład. var list = new [] {1,2,3,1,4,2};
więc pogrupuj według, pogrupuje liczby według ich kluczy i zachowa z nim liczbę (liczbę powtórzeń). Następnie sprawdzamy tylko wartości, które powtórzyły się tylko raz, gdy środki są unikalne.
źródło
var unique = list.Distinct(x => x)
Pełny zestaw rozszerzeń Linq na SQL funkcji duplikatów sprawdzonych w MS SQL Server. Bez użycia .ToList () lub IEnumerable. Te zapytania są wykonywane w programie SQL Server, a nie w pamięci. . Wyniki wracają tylko do pamięci.
źródło
jest odpowiedź, ale nie rozumiem, dlaczego nie działa;
moje rozwiązanie jest takie w tej sytuacji;
źródło