web-dev-qa-db-fra.com

Supprimer l'élément dans le dictionnaire en fonction de la valeur

J'ai un Dictionary<string, string>.

J'ai besoin de regarder dans ce dictionnaire pour voir si une valeur existe basée sur une entrée venant ailleurs et si elle existe, supprimez-la.

ContainsValue dit simplement vrai/faux et non l'index ou la clé de cet élément.

Aidez-moi!

Merci

EDIT: Je viens de trouver ceci - qu'en pensez-vous?

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

EDIT 2: Je viens aussi de cogner ce qui pourrait fonctionner

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

Essayez-vous de supprimer une seule valeur ou toutes les valeurs correspondantes?

Si vous essayez de supprimer une seule valeur, comment définissez-vous la valeur que vous souhaitez supprimer?

La raison pour laquelle vous ne récupérez pas de clé lorsque vous interrogez des valeurs est parce que le dictionnaire peut contenir plusieurs clés associées à la valeur spécifiée.

Si vous souhaitez supprimer toutes les instances correspondantes de la même valeur, vous pouvez procéder comme suit:

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

Et si vous souhaitez supprimer la première instance correspondante, vous pouvez effectuer une requête pour trouver le premier élément et simplement supprimer ce qui suit:

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

dic.Remove(item.Key);

Remarque: L'appel ToList() est nécessaire pour copier les valeurs dans une nouvelle collection. Si l'appel n'est pas effectué, la boucle modifiera la collection sur laquelle elle est itérative, provoquant la levée d'une exception lors de la prochaine tentative d'itération après la suppression de la première valeur.

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

Parcourez le dictionnaire pour trouver l'index, puis supprimez-le.

2
Xinus

Voici une méthode que vous pouvez utiliser:

    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

Dans mon cas j'utilise ceci

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