5 Stimmen

So löschen Sie Einträge aus einem Wörterbuch mit dem Wert

Ich habe auch eine Wörterbuchsammlung:

mydic.addvalue(key1, val1)
mydic.addvalue(key2, val1)
mydic.addvalue(key3, val1)
mydic.addvalue(key4, val2)
mydic.addvalue(key5, val2)

Aus dem obigen Wörterbuch möchte ich alle Einträge löschen, bei denen der Wert == "val1" ist, so dass das Ergebnis nur den folgenden Eintrag enthalten würde:

mydic.addvalue(key4, val2)
mydic.addvalue(key5, val2)

Mein VB-Quellcode läuft unter VS2008 und ist für 3.5

1 Stimmen

Und die Typen von Schlüssel und Wert sind?

0 Stimmen

@user: Es ist kein C#-Wörterbuch. Es ist das .NET Framework Dictionary<TKey,TValue> Klasse.

15voto

dtb Punkte 205441

Sie müssen zunächst alle Schlüssel finden, deren zugehöriger Wert val1 :

var keysToRemove = mydic.Where(kvp => kvp.Value == val1)
                        .Select(kvp => kvp.Key)
                        .ToArray();

Dann können Sie jeden dieser Schlüssel entfernen:

foreach (var key in keysToRemove)
{
    mydic.Remove(key);
}

13voto

Anthony Pegram Punkte 119149

Eine Nicht-LINQ-Antwort auf der Grundlage eines Kommentars des Benutzers.

private static void RemoveByValue<TKey,TValue>(Dictionary<TKey, TValue> dictionary, TValue someValue)
{
    List<TKey> itemsToRemove = new List<TKey>();

    foreach (var pair in dictionary)
    {
        if (pair.Value.Equals(someValue))
            itemsToRemove.Add(pair.Key);
    }

    foreach (TKey item in itemsToRemove)
    {
        dictionary.Remove(item);
    }
}

Beispiel für die Verwendung:

Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "foo");
dictionary.Add(2, "foo");
dictionary.Add(3, "bar");
string someValue = "foo";
RemoveByValue(dictionary, someValue);

Gleicher Vorbehalt wie bei den anderen Antworten: Wenn Ihr Wert die Gleichheit durch eine Referenz bestimmt, müssen Sie zusätzliche Arbeit leisten. Dies ist nur eine Basis.

3voto

Ta01 Punkte 30128

Sie können auch Folgendes verwenden

var x= (from k in mydic
           where k.Value != val1
           select k).ToDictionary(k=>k.key);

x wird keinen der Werte von val1 haben

1voto

zhy2002 Punkte 410
foreach(var key in dict.AllKeys.ToArray())
{
    if(...)
        //remove key or something
}

1voto

LukeIsZed Punkte 51

Die Antwort ist zwar alt, aber so mache ich das Gleiche, ohne ein neues Dictionary zu erstellen.

foreach (KeyValuePair<TKey, TValue> x in MyDic) {

  if (x.Value == "val1")) 
  {  MyDic.Remove(x.Key); } 
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X