web-dev-qa-db-ja.com

値に基づいて辞書のアイテムを削除

私はDictionary<string, string>

その辞書内を調べて、他の場所からの入力に基づいて値が存在するかどうかを確認し、存在する場合は削除します。

ContainsValueは、そのアイテムのインデックスまたはキーではなく、単にtrue/falseを示します。

助けて!

ありがとう

編集:これを見つけました-どう思いますか?

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

編集2:私もこれをノックしただけでうまくいくかもしれない

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

単一の値または一致するすべての値を削除しようとしていますか?

単一の値を削除しようとしている場合、削除する値をどのように定義しますか?

値を照会するときにキーを取得しない理由は、指定した値とペアになった複数のキーが辞書に含まれている可能性があるためです。

同じ値の一致するすべてのインスタンスを削除する場合は、これを実行できます。

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

また、最初に一致したインスタンスを削除する場合は、最初のアイテムを検索して削除するだけで済みます:

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

dic.Remove(item.Key);
_

注:値を新しいコレクションにコピーするには、ToList()呼び出しが必要です。呼び出しが行われない場合、ループは反復しているコレクションを変更するため、最初の値が削除された後の反復試行で例外がスローされます。

117
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

辞書をループしてインデックスを見つけてから削除します。

2
Xinus

拡張メソッドとして次を使用できます

 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

使用できる方法は次のとおりです。

    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

私の場合、これを使用します

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