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
Ihr diese Überprüfung:
if (!lines2.Contains(lines3.ToString()))
ist ungültig. Sie prüfen, ob Ihr lines2
System.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.
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.
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);
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.
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
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();
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. :)
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();
}
}
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;
}
}
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.
verwenden Sie HashSet
, es ist besser
schauen Sie hier: http://www.dotnetperls.com/hashset