Pracowałem z string[]
tablicą w języku C #, która jest zwracana z wywołania funkcji. Mogłem ewentualnie przesyłać do Generic
kolekcji, ale zastanawiałem się, czy istnieje lepszy sposób, aby to zrobić, być może przy użyciu tablicy tymczasowej.
Jaki jest najlepszy sposób na usunięcie duplikatów z tablicy C #?
c#
arrays
duplicates
lomaxx
źródło
źródło
Odpowiedzi:
Aby to zrobić, możesz użyć zapytania LINQ:
źródło
.Distinct(StringComparer.OrdinalIgnoreCase)
aby otrzymać rozróżniany bez rozróżniania wielkości liter zestaw ciągów.The Distinct() method returns an unordered sequence that contains no duplicate values.
Oto podejście HashSet <ciąg> :
Niestety to rozwiązanie wymaga również .NET Framework 3.5 lub nowszego, ponieważ HashSet został dodany dopiero w tej wersji. Możesz także użyć array.Distinct () , która jest funkcją LINQ.
źródło
Poniższy przetestowany i działający kod usunie duplikaty z tablicy. Musisz dołączyć przestrzeń nazw System.Collections.
Możesz zawinąć to w funkcję, jeśli chcesz.
źródło
Jeśli musisz to posortować, możesz zaimplementować sortowanie, które również usuwa duplikaty.
Zabija dwa ptaki jednym kamieniem.
źródło
Może to zależeć od tego, jak bardzo chcesz zaprojektować rozwiązanie - jeśli tablica nigdy nie będzie tak duża i nie obchodzi Cię sortowanie listy, możesz spróbować czegoś podobnego do następującego:
źródło
- To pytanie do wywiadu zadawane za każdym razem. Teraz zrobiłem jego kodowanie.
źródło
To jest O (n ^ 2) , co nie będzie miało znaczenia dla krótkiej listy, która ma zostać upakowana w kombinację, ale może szybko stanowić problem w dużej kolekcji.
źródło
źródło
Oto podejście O (n * n), które wykorzystuje przestrzeń O (1) .
Podejścia do hash / linq powyżej są tym, czego zwykle używasz w prawdziwym życiu. Jednak w wywiadach zwykle chcą nałożyć pewne ograniczenia, np. Stałą przestrzeń wykluczającą hasz lub brak wewnętrznego interfejsu API - co wyklucza użycie LINQ .
źródło
strIn[j] == strIn[i]
) będzie porównywała ciąg do siebie, chyba że zostanie uwzględniona instrukcja if.Dodaj wszystkie ciągi do słownika, a następnie uzyskaj właściwość Keys. Spowoduje to wygenerowanie każdego unikalnego ciągu, ale niekoniecznie w tej samej kolejności, w jakiej znajdowały się w nim oryginalne dane wejściowe.
Jeśli chcesz, aby wynik końcowy miał taką samą kolejność jak oryginalne dane wejściowe, rozważając pierwsze wystąpienie każdego łańcucha, zastosuj następujący algorytm:
Na końcu lista zawiera pierwsze wystąpienie każdego unikalnego ciągu.
Upewnij się, że podczas konstruowania słownika bierzesz pod uwagę takie elementy, jak kultura, i upewnij się, że poprawnie obsługujesz duplikaty z literami akcentowanymi.
źródło
Poniższy fragment kodu próbuje usunąć duplikaty z ArrayList, choć nie jest to optymalne rozwiązanie. Zadano mi to pytanie podczas wywiadu w celu usunięcia duplikatów poprzez rekurencję i bez użycia tablicy drugiego / tymczasowego:
źródło
Proste rozwiązanie:
źródło
Może hashset, który nie przechowuje duplikatów elementów i po cichu ignoruje żądania dodania duplikatów.
źródło
UWAGA: NIE testowane!
Może zrobić to, czego potrzebujesz ...
EDYCJA Argh !!! pobity przez rob przez niecałą minutę!
źródło
Przetestowałem poniżej i działa. Fajne jest to, że przeprowadza wyszukiwanie wrażliwe na kulturę
}
--AptSenSDET
źródło
Ten kod w 100% usuwa zduplikowane wartości z tablicy [jak użyłem [i]] ..... Możesz przekonwertować go na dowolny język OO ..... :)
źródło
Ogólna metoda rozszerzenia:
źródło
możesz użyć tego kodu podczas pracy z ArrayList
źródło
źródło
Poniżej znajduje się prosta logika w java, w której dwukrotnie przemierzasz elementy tablicy, a jeśli widzisz ten sam element, przypisujesz mu zero, a także nie dotykasz indeksu elementu, który porównujesz.
źródło
źródło
źródło
Kkk Nie jestem pewien, czy to czary, czy tylko piękny kod
1 strINvalues .Split (','). Distinct (). ToArray ()
2) string.Join (",", XXX);
1 Podział tablicy i użycie Distinct [LINQ] do usunięcia duplikatów 2 Ponowne połączenie z powrotem bez duplikatów.
Niestety, nigdy nie czytałem tekstu na StackOverFlow, tylko kod. ma to większy sens niż tekst;)
źródło
źródło
Najlepszym sposobem? Trudno powiedzieć, podejście HashSet wygląda szybko, ale (w zależności od danych) użycie algorytmu sortowania (CountSort?) Może być znacznie szybsze.
Prawie bez oddziałów. W jaki sposób? Tryb debugowania, krok do (F11) z małą tablicą: {1,3,1,1,0}
Rozwiązanie z dwiema zagnieżdżonymi pętlami może zająć trochę czasu, szczególnie w przypadku większych tablic.
źródło