Rimuovi elemento nel dizionario in base al valore

Ho un Dictionary .

Devo cercare all’interno di quel dizionario per vedere se esiste un valore basato sull’input da qualche altra parte e se esiste rimuoverlo.

ContainsValue dice solo true / false e non l’indice o la chiave di quell’elemento.

Aiuto!

Grazie

EDIT: appena trovato questo – cosa ne pensi?

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

EDIT 2: ho anche appena messo in discussione ciò che potrebbe funzionare

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

Stai cercando di rimuovere un singolo valore o tutti i valori corrispondenti?

Se stai cercando di rimuovere un singolo valore, come definisci il valore che desideri rimuovere?

Il motivo per cui non si ottiene una chiave indietro quando si esegue una query sui valori è perché il dizionario potrebbe contenere più chiavi abbinate al valore specificato.

Se desideri rimuovere tutte le istanze corrispondenti dello stesso valore, puoi farlo:

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

E se desideri rimuovere la prima istanza corrispondente, puoi eseguire una query per trovare il primo elemento e rimuovere semplicemente quello:

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

Nota: la chiamata ToList() è necessaria per copiare i valori in una nuova raccolta. Se la chiamata non viene effettuata, il ciclo modificherà la raccolta su cui si sta iterando, causando un’eccezione nel tentativo successivo di iterare dopo la rimozione del primo valore.

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

Passa attraverso il dizionario per trovare l’indice e quindi rimuoverlo.

Ecco un metodo che puoi usare:

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

Nel mio caso lo uso

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

È ansible utilizzare il seguente metodo di estensione

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