2013-04-07 15 views
7

mam:Jak znaleźć zduplikowane elementy na liście <>?

List<string> list = new List<string>() { "a", "a", "b", "b", "r", "t" }; 

Jak mogę dostać tylko "a", "b"?

Próbowałem zrobić tak:

List<string> list = new List<string>() { "a", "a", "b", "b", "r", "t" }; 
List<string> test_list = new List<string>(); 

test_list = list.Distinct().ToList(); 

Teraz test_list ma { "a", "b", "R", "t"}
, a następnie:

test_list = test_list.Except(list).ToList(); 

Tak więc to był mój punkt awaryjny, bo Except() usunął wszystkie elementy.

Czy możesz mi pomóc w rozwiązaniu?

+1

Spójrz na metodę "GroupBy". – Oded

+0

Całkowicie oczekiwane zachowanie. Z wyjątkiem() z wyjątkiem test_list wszystkie wpisy znalezione na liście. Co próbujesz zrobić? – Tommi

+0

możliwy duplikat [Jak uzyskać zduplikowane elementy z listy za pomocą LINQ?] (Http://stackoverflow.com/questions/3811464/how-to-get-duplicate-items-from-a-list-using-linq) –

Odpowiedz

9

Spróbuj

var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList(); 
+6

Nie rozumiem, dlaczego ta odpowiedź została wznowiona. Ktoś próbował tego z '{" a "," a "," b "," b "," a "," r "," t "}'? – I4V

+0

Ty możesz to zrobić. Szczerze mówiąc, musiałem zbyt długo zastanawiać się nad tym, dlaczego ta metoda faktycznie działa. Wolę l4V; znacznie czytelniejsze i bardziej precyzyjne. EDYCJA: Może jest szybciej, ale wątpię, aby wydajność była w tym przypadku jakakolwiek kwestia. –

+1

I4V, masz rację, to nie działa poprawnie – Alex

0
var duplicates = list.GroupBy(s => s).SelectMany(g => g.Skip(1).Take(1)).ToList(); 
+0

To jest niepoprawna pierwsza wersja [@ Sachin's answer] (http://stackoverflow.com/a/15866810/200449), zobacz komentarze do niej i jej zmiany –

+0

To była dla mnie najlepsza opcja. Tęsknię za jednym punktem w moim pytaniu: jeśli mam {a, a, a, b, b, r}, tak na wyjściu powinienem dostać {a, a, b} – Alex

3

Prostym podejściem jest użycie Enumerable.GroupBy:

var dups = list.GroupBy(s => s) 
       .Where(g => g.Count() > 1) 
       .Select(g => g.Key); 
16
List<string> list = new List<string>() { "a", "a", "b", "b", "r", "t" }; 

var dups = list.GroupBy(x => x) 
    .Where(x => x.Count() > 1) 
    .Select(x => x.Key) 
    .ToList(); 
+2

Jest to bardziej czytelne i zrozumiałe, Dzięki –

0
var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList(); 

To będzie bardziej skuteczne wtedy jeden z użyciem Where(g => g.Count() > 1) i zwróci tylko jeden element z każdej grupy.

10
var list = new List<string> { "a", "a", "b", "b", "r", "t" }; 

var distinct = new HashSet<string>();  
var duplicates = new HashSet<string>(); 

foreach (var s in list) 
    if (!distinct.Add(s)) 
     duplicates.Add(s); 

// distinct == { "a", "b", "r", "t" } 
// duplicates == { "a", "b" } 
+2

+ 1 prawdopodobnie najbardziej efektywne podejście. –

Powiązane problemy