2013-01-21 14 views
15
string[] lines3 = new string[100]; 
List<string> lines2 = new List<string>(); 
lines3 = Regex.Split(s1, @"\s*,\s*"); 

if (!lines2.Contains(lines3.ToString())) 
{ 
    lines2.AddRange(lines3.Distinct().ToArray()); 
} 

Sprawdziłem wszystkie przestrzenie itp ale ja wciąż dostać zduplikowane wartości w moim lines2 Listunikać dodawania zduplikowane elementy do listy C#

muszę usunąć moje zduplikowane wartości tu sobie

+0

lines2 lista ciąg przepraszam że popełnił mały błąd podczas kopiowania i wklejania kodu – vini

+0

może istnieć przestrzeń pomiędzy dwoma strunami jak = SBC BGP – vini

+2

Czy można uznać za pomocą HashSet zamiast listy dla w tym przypadku będzie działać znacznie lepiej. – bashmohandes

Odpowiedz

18

Twój This sprawdź:

if (!lines2.Contains(lines3.ToString())) 

jest nieprawidłowy. Sprawdzasz, czy Twój numer lines2 zawiera System.String[] od lines3.ToString(). Musisz sprawdzić, czy pozycja z lines3 istnieje w lines2, czy też nie.

Możesz iterować każdy element w lines3 sprawdź, czy istnieje w lines2, a następnie dodaj. Coś jak.

foreach (string str in lines3) 
{ 
    if (!lines2.Contains(str)) 
     lines2.Add(str); 
} 

lub jeśli lines2 jest jakaś pusta lista, wówczas można po prostu dodać lines3 odrębne wartości do listy jak:

lines2.AddRange(lines3.Distinct()); 

wówczas lines2 będą zawierać odrębne wartości.

3

Jeśli nie chcesz duplikatów na liście, użyj numeru HashSet. W ten sposób będzie jasne dla każdego, kto przeczyta twój kod, jaki był twój zamiar, a będziesz miał mniej kodu do napisania, ponieważ już HashSet zajmuje się tym, co próbujesz zrobić.

+1

dla osób rozważających hashset pl należy pamiętać, że nie można zagwarantować zamówienia. – BKSpurgeon

1

Jeśli twoja kontrola zadziałałaby, to albo dodałaby wszystkie pozycje, albo wcale. Jednak wywołanie metody ToString w tablicy zwraca nazwę typu danych, a nie zawartość tablicy, a metoda Contains może tylko wyszukać pojedynczy element, a nie zbiór elementów.

Musisz sprawdzić każdy ciąg w tablicy:

string[] lines3; 
List<string> lines2 = new List<string>(); 

lines3 = Regex.Split(s1, @"\s*,\s*"); 

foreach (string s in lines3) { 
    if (!lines2.Contains(s)) { 
    lines2.Add(s); 
    } 
} 

Jednak jeśli zaczniesz z pustą listę, można użyć metody Distinct do usuwania duplikatów, a potrzebny jest tylko jeden wiersz Kod:

List<string> lines2 = Regex.Split(s1, @"\s*,\s*").Distinct().ToList(); 
23

można użyć Enumerable.Except aby uzyskać różne przedmioty z lines3 która nie jest lines2:

lines2.AddRange(lines3.Except(lines2)); 

Jeśli linie2 zawiera wszystkie elementy z linii3, nic nie zostanie dodane. BTW wewnętrznie Oprócz użycia Set<string>, aby uzyskać różne elementy z drugiej sekwencji i zweryfikować te elementy obecne w pierwszej sekwencji. Jest dość szybki.

1

Można użyć prostego Union + Distinct:

var lines = lines2.Union(lines3).Distinct(); 

To doda wszystkie elementy z drugiej listy do pierwszej listy, a następnie powrócić wszystkie unikalne ciągi w połączonej listy. Prawdopodobnie nie będzie dobrze działać z dużymi listami, ale jest to proste.

referencyjny: http://msdn.microsoft.com/en-us/library/bb341731.aspx

1

Jeśli chcesz zapisać różne wartości w kolekcji można spróbować HashSet Class. Automatycznie usunie zduplikowane wartości i zapisze czas kodowania. :)

19

użyć HashSet<string> zamiast List<string>. Jest przygotowany, aby osiągnąć lepszą wydajność, ponieważ nie musisz dostarczać czeków na żadne przedmioty. Kolekcja będzie nim zarządzać. Taka jest różnica między list i set. Dla próbki:

HashSet<string> set = new HashSet<string>(); 

set.Add("a"); 
set.Add("a"); 
set.Add("b"); 
set.Add("c"); 
set.Add("b"); 
set.Add("c"); 
set.Add("a"); 
set.Add("d"); 
set.Add("e"); 
set.Add("e"); 

var total = set.Count; 

Ogółem 5 i wartości są a, b, c, d, e.

Implementacja List<T> nie daje natywnie. Możesz to zrobić, ale musisz zapewnić tę kontrolę. Na próbce, to extension method:

public static class CollectionExtensions 
{ 
    public static void AddItem<T>(this List<T> list, T item) 
    { 
     if (!list.Contains(item)) 
     { 
      list.Add(item); 
     } 
    } 
} 

i używać go:

var list = new List<string>(); 
list.AddItem(1); 
list.AddItem(2); 
list.AddItem(3); 
list.AddItem(2); 
list.AddItem(4); 
list.AddItem(5); 
+0

Należy pamiętać, że 'HashSet' jest nieuporządkowany, co oznacza, że ​​nie zachowuje porządku, w którym zostały dodane elementy. Jeśli musi zachować określone zamówienie, 'HashSet' nie będzie działać. –

0

Użyj HashSet wraz z List:

List<string> myList = new List<string>(); 
HashSet<string> myHashSet = new HashSet<string>(); 

public void addToList(string s) { 
    if (myHashSet.Add(s)) { 
     myList.Add(s); 
    } 
} 

myHashSet.Add(s) powróci true jeśli s nie istnieją w nim .

0

nie jest to dobry sposób, ale rodzaj szybkiego rozwiązania, wykonaj test, aby sprawdzić, czy na całej liście istnieje dowolny duplikat wpisu.

bool containsKey; 
string newKey; 

    public void addKey(string newKey){ 

     foreach(string key in MyKeys){ 
      if(key == newKey){ 
      containsKey = true; 
      } 
     } 

     if(!containsKey){ 
     MyKeys.add(newKey); 
    }else{ 
     containsKey = false; 
    } 

    } 
Powiązane problemy