webentwicklung-frage-antwort-db.com.de

Vermeiden Sie das Hinzufügen doppelter Elemente zu einer Liste C #

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());
}

Ich habe alle Leerzeichen usw. geprüft, bekomme aber trotzdem doppelte Werte in meinen Zeilen2. List

Ich muss meine doppelten Werte hier selbst entfernen 

18
vini

Ihr diese Überprüfung: 

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

ist ungültig. Sie prüfen, ob Ihr lines2System.String[] enthält, da lines3.ToString() Ihnen dies geben wird. Sie müssen prüfen, ob ein Artikel aus lines3 in lines2 vorhanden ist oder nicht. 

Sie können jedes Element in lines3 überprüfen, ob es im lines2 vorhanden ist, und es dann hinzufügen. So etwas wie. 

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

Wenn es sich bei Ihrem lines2 um eine leere Liste handelt, können Sie einfach die eindeutigen lines3-Werte der Liste hinzufügen: 

lines2.AddRange(lines3.Distinct());

ihr lines2 enthält dann unterschiedliche Werte. 

25
Habib

Sie können Enumerable.Except verwenden, um verschiedene Elemente von Zeilen3 abzurufen, die nicht in Zeilen2 enthalten sind:

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

Wenn Zeilen2 alle Elemente aus Zeilen3 enthält, wird nichts hinzugefügt. BTW intern Except verwendet Set<string>, um verschiedene Elemente aus der zweiten Sequenz abzurufen und die in der ersten Sequenz vorhandenen Elemente zu überprüfen. Es ist also ziemlich schnell.

33

Verwenden Sie einen HashSet<string> anstelle eines List<string>. Es ist bereit, eine bessere Leistung zu erbringen, da Sie keine Prüfungen für Elemente durchführen müssen. Die Sammlung verwaltet es für Sie. Das ist der Unterschied zwischen einer list und einer set. Für probe:

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;

Summe ist 5 und die Werte sind a, b, c, d, e.

Die Implementierung von List<T> gibt Ihnen keine Geburtshilfe. Sie können es tun, aber Sie müssen diese Kontrolle bereitstellen. Zum Beispiel dieser extension method:

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

und benutze es:

var list = new List<string>();
list.AddItem(1);
list.AddItem(2);
list.AddItem(3);
list.AddItem(2);
list.AddItem(4);
list.AddItem(5);
22
Felipe Oriani

Wenn Sie keine Duplikate in einer Liste haben möchten, verwenden Sie eine HashSet . Auf diese Weise wird jedem, der Ihren Code liest, klar, was Ihre Absicht war, und Sie müssen weniger Code schreiben, da HashSet bereits das erledigt, was Sie versuchen.

3
Ian Mercer

Sie könnten eine einfache Union + Distinct verwenden:

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

Dadurch werden alle Elemente aus der zweiten Liste der ersten Liste hinzugefügt und anschließend alle eindeutigen Zeichenfolgen in der kombinierten Liste zurückgegeben. Bei großen Listen wahrscheinlich nicht gut, aber es ist einfach.

Referenz: http://msdn.Microsoft.com/de-de/library/bb341731.aspx

3
Tieson T.

Wenn Ihr Scheck funktioniert hätte, hätte er entweder alle Elemente hinzugefügt oder gar keine. Beim Aufruf der ToString-Methode für ein Array wird jedoch der Name des Datentyps und nicht der Inhalt des Arrays zurückgegeben. Die Contains-Methode kann jedoch nur nach einem einzelnen Element suchen und nicht nach einer Objektgruppe.

Sie müssen jeden String im Array überprüfen:

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);
  }
}

Wenn Sie jedoch mit einer leeren Liste beginnen, können Sie die Duplikate mit der Distinct-Methode entfernen, und Sie benötigen nur eine einzige Codezeile:

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

Wenn Sie unterschiedliche Werte in einer Sammlung speichern möchten, können Sie HashSet Class versuchen. Es entfernt automatisch die doppelten Werte und speichert die Codierungszeit. :)

1
Erxin

Ich nahm den Hinweis von #Felipe Oriani und machte die Erweiterung, die ich hier für immer teilen möchte.

public static class CollectionExtension
{
    public static void AddUniqueItem<T>(this List<T> list, T item, bool throwException)
    {
        if (!list.Contains(item))
        {
            list.Add(item);
        }
        else if(throwException)
        {
            throw new InvalidOperationException("Item already exists in the list");
        }
    }
    public static bool IsUnique<T>(this List<T> list, IEqualityComparer<T> comparer)
    {
        return list.Count == list.Distinct(comparer).Count();
    }
    public static bool IsUnique<T>(this List<T> list)
    {
        return list.Count == list.Distinct().Count();
    }
}
0
Kasim Husaini

kein guter Weg, aber eine Art schnelle Lösung. Nehmen Sie einen Bool, um zu überprüfen, ob in der gesamten Liste ein doppelter Eintrag vorhanden ist.

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;
     }

    }
0
Amir Javed

Verwenden Sie eine HashSet zusammen mit Ihrer 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) gibt true zurück, wenn s nicht vorhanden ist.

0

verwenden Sie HashSet, es ist besser

schauen Sie hier: http://www.dotnetperls.com/hashset

0
danvasiloiu