2010-11-24 7 views
5

Ich merke, dass ich dies ziemlich häufig schreibe.Native C# .NET-Methode, um zu prüfen, ob ein Element in der Sammlung vor dem Hinzufügen vorhanden ist

Hashtable h = new Hashtable(); 
string key = "hahahahaahaha"; 
string value = "this value"; 
if (!h.Contains(key)) 
{ 
    h.Add(key, value); 
} 

Gibt es eine native Methode (vielleicht wie addif etwas() ??), die überprüft, ob es in der Sammlung vorhanden ist und wenn es nicht der Fall ist, fügt sie der Sammlung? Also würde mein Beispiel ändern zu:

Dies würde jenseits eines Hastable gelten. Grundsätzlich jede Sammlung, die eine .Add-Methode hat.

EDIT: Aktualisiert einen Wert hinzufügen, wenn sie dem Hashtable hinzugefügt :)

Antwort

10

Nun, Sie schreiben wahrscheinlich nicht , dass Code, weil Hashtable Schlüssel/Wert-Paare verwendet, nicht nur Schlüssel.

Wenn Sie .NET 3.5 oder höher verwenden, schlage ich vor, Sie verwenden HashSet<T>, und dann können Sie einfach Add aufrufen - der Rückgabewert wird angeben, ob es tatsächlich hinzugefügt wurde oder nicht.

EDIT: Okay, jetzt wissen wir, Sie sprechen über Schlüssel/Wert-Paare - es gibt nichts eingebaut für eine bedingte hinzufügen (Nun, es gibt in ConcurrentDictionary IIRC, aber ...), aber wenn Sie sind glücklich den vorhandenen Wert zu überschreiben, können Sie einfach den Indexer verwenden:

h[key] = value; 

im Gegensatz zu Add, die eine Ausnahme nicht, ob es bereits ein Eintrag für den Schlüssel werfen - es es einfach überschrieben werden.

+0

Danke für die Antwort Jon und du hast Recht. Ich arbeitete mit einer Hashtable und verwendete Schlüssel UND Werte. Als ich diese Frage schrieb, kam ich mir selbst voran :) –

+0

@rodey: Also müssen Sie überprüfen, ob der Wert derselbe ist? –

+0

Meine Frage war nicht spezifisch für die Hashtable. Es könnte eine Hashtable, ein Dictionary, eine List usw. sein. Die erwähnten Collections haben alle eine .Add-Methode, und da wollte ich wissen, ob für diese Kollektionen etwas wie ein AddIf existiert. –

8

ist es nicht eine solche Methode in dem .NET-Framework. Aber Sie können Ihre eigene Erweiterungsmethode leicht schreiben:

public static void AddIfNotExists<T>(this ICollection<T> coll, T item) { 
    if (!coll.Contains(item)) 
     coll.Add(item) 
} 

Für IDictionary, ich benutze diese Methode (in der Regel für Dictionary<TKey, List<TValue>> und Variationen):

public static TValue AddIfNotExists<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key) 
    where TValue : new() 
{ 
    TValue value; 
    if (!dict.TryGetValue(key, out value)) 
    { 
     value = new T(); 
     dict.Add(key, value); 
    } 
    return value; 
} 
+1

+1 Darüber hinaus stellen Sie sicher, dass equals/hash für den Typ definiert ist als zu bieten erwartet enthält Verhalten, es sei denn, die gleiche Referenz ist alles, was kümmert. –

0

Ihr Code ist nicht sinnvoll, da eine HashTable benötigt einen Schlüssel und einen Wert.

Wenn Sie eine HashSet<T> gemeint haben, wird der Aufruf Add nichts tun, wenn der Artikel bereits da ist.

Wenn Sie eine Dictionary<TKey, TValue> gemeint haben, können Sie schreiben dict[key] = value, die den Schlüssel hinzufügen wird, wenn es nicht vorhanden ist, oder es überschreiben, wenn es ist.

+0

Sie haben Recht.Ich habe mich selbst übertroffen, als ich das Beispiel schrieb. Ich habe meinen Code aktualisiert. –

0

Bisher ist es nicht. Aber Sie könnten Ihre eigene Erweiterungsmethode schreiben, um dies in einer einzigen Zeile zu umhüllen.

1

Für eine Hash-Tabelle Sie myHashtable[key] = myHashtable[key] ?? newValue wo die rechte Seite, wenn myHashtable[key] und sonst zu newVale ich ein ähnliches Verfahren in meiner benutzerdefinierten Wörterbuch/Hashtable oft

0

lösen, um das zu beheben, wenn nicht auf null bewertet überprüfen würde zuerst schreiben könnte schreiben Sammlungen, wie ein , nicht als void AddIf(Key)

Verwandte Themen