wake-up-neo.com

Entfernen Sie das Element im Wörterbuch basierend auf dem Wert

Ich habe einen Dictionary<string, string>.

Ich muss in diesem Wörterbuch nachsehen, ob ein Wert vorhanden ist, der auf Eingaben von einer anderen Stelle basiert, und ob er vorhanden ist, um ihn zu entfernen.

ContainsValue sagt nur true/false und nicht den Index oder Schlüssel dieses Elements.

Hilfe!

Vielen Dank

EDIT: Gerade gefunden - was denkst du?

var key = (from k in dic where string.Compare(k.Value, "two", true) ==
0 select k.Key).FirstOrDefault();

EDIT 2: Ich habe das auch gerade kaputt gemacht, was funktionieren könnte

foreach (KeyValuePair<string, string> kvp in myDic)
{
    if (myList.Any(x => x.Id == kvp.Value))
        myDic.Remove(kvp.Key);
}
49
Jon

Versuchen Sie, einen einzelnen Wert oder alle übereinstimmenden Werte zu entfernen?

Wenn Sie versuchen, einen einzelnen Wert zu entfernen, wie definieren Sie den Wert, den Sie entfernen möchten?

Der Grund, warum Sie bei der Abfrage von Werten keinen Schlüssel zurückerhalten, ist, dass das Wörterbuch mehrere Schlüssel enthalten kann, die mit dem angegebenen Wert gepaart sind.

Wenn Sie alle übereinstimmenden Instanzen mit demselben Wert entfernen möchten, können Sie Folgendes tun:

foreach(var item in dic.Where(kvp => kvp.Value == value).ToList())
{
    dic.Remove(item.Key);
}

Und wenn Sie die erste übereinstimmende Instanz entfernen möchten, können Sie nach dem ersten Objekt suchen und es einfach entfernen:

var item = dic.First(kvp => kvp.Value == value);

dic.Remove(item.Key);

Hinweis: Der Aufruf ToList() ist erforderlich, um die Werte in eine neue Sammlung zu kopieren. Wenn der Aufruf nicht erfolgt, ändert die Schleife die Sammlung, über die iteriert wird. Dadurch wird beim nächsten Iterationsversuch eine Ausnahme ausgelöst, nachdem der erste Wert entfernt wurde.

110
Paul Turner
Dictionary<string, string> source
//
//functional programming - do not modify state - only create new state
Dictionary<string, string> result = source
  .Where(kvp => string.Compare(kvp.Value, "two", true) != 0)
  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
//
// or you could modify state
List<string> keys = source
  .Where(kvp => string.Compare(kvp.Value, "two", true) == 0)
  .Select(kvp => kvp.Key)
  .ToList();

foreach(string theKey in keys)
{
  source.Remove(theKey);
}
7
Amy B

Blättern Sie durch das Wörterbuch, um den Index zu finden, und entfernen Sie ihn dann.

2
Xinus

Sie können folgende Erweiterungsmethode verwenden

 public static void RemoveByValue<T,T1>(this Dictionary<T,T1> src , T1 Value)
    {
        foreach (var item in src.Where(kvp => kvp.Value.Equals( Value)).ToList())
        {
            src.Remove(item.Key);
        }
    }
1
shoushouleb86

Hier ist eine Methode, die Sie verwenden können:

    public static void RemoveAllByValue<K, V>(this Dictionary<K, V> dictionary, V value)
    {
        foreach (var key in dictionary.Where(
                kvp => EqualityComparer<V>.Default.Equals(kvp.Value, value)).
                Select(x => x.Key).ToArray())
            dictionary.Remove(key);
    }
1
ezolotko

In meinem Fall verwende ich das

  var key=dict.FirstOrDefault(m => m.Value == s).Key;
            dict.Remove(key);
0