私は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);
}
単一の値または一致するすべての値を削除しようとしていますか?
単一の値を削除しようとしている場合、削除する値をどのように定義しますか?
値を照会するときにキーを取得しない理由は、指定した値とペアになった複数のキーが辞書に含まれている可能性があるためです。
同じ値の一致するすべてのインスタンスを削除する場合は、これを実行できます。
_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()
呼び出しが必要です。呼び出しが行われない場合、ループは反復しているコレクションを変更するため、最初の値が削除された後の反復試行で例外がスローされます。
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);
}
辞書をループしてインデックスを見つけてから削除します。
拡張メソッドとして次を使用できます
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);
}
}
使用できる方法は次のとおりです。
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);
}
私の場合、これを使用します
var key=dict.FirstOrDefault(m => m.Value == s).Key;
dict.Remove(key);