:辞書から要素を削除<Key, Item> Iアイテム(たとえば)が辞書有する
- "A" を、4
- "B"、44
- "BYE"、56
- "C"、99
- "D"、46
- "6672"、0
そして私はリストがあります:
- ""
- "C"
- "D"
私は私の辞書から、キーがあるすべての要素を削除するにない私のリストに、最後に私の辞書は次のようになります:
- "A"、4
- "C"、99
- "D"、46
私はどのように行うことができますか?
:辞書から要素を削除<Key, Item> Iアイテム(たとえば)が辞書有する
そして私はリストがあります:
私は私の辞書から、キーがあるすべての要素を削除するにない私のリストに、最後に私の辞書は次のようになります:
私はどのように行うことができますか?
これは、リストにある要素を含むように新しい辞書を構築するために簡単です:
List<string> keysToInclude = new List<string> {"A", "B", "C"};
var newDict = myDictionary
.Where(kvp=>keysToInclude.Contains(kvp.Key))
.ToDictionary(kvp=>kvp.Key, kvp=>kvp.Value);
それは、既存の辞書(例えばを変更することが重要な場合
var keysToRemove = myDictionary.Keys.Except(keysToInclude).ToList();
foreach (var key in keysToRemove)
myDictionary.Remove(key);
ToList()呼び出しに注意してください。削除するキーのリストを具体化することが重要です。 keysToRemove
のマテリアライゼーションなしでコードを実行しようとすると、「コレクションが変更されました」というような例外が発生する可能性があります。
// For efficiency with large lists, for small ones use myList below instead.
var mySet = new HashSet<string>(myList);
// Create a new dictionary with just the keys in the set
myDictionary = myDictionary
.Where(x => mySet.Contains(x.Key))
.ToDictionary(x => x.Key, x => x.Value);
コード:
public static void RemoveAll<TKey, TValue>(this Dictionary<TKey, TValue> target,
List<TKey> keys)
{
var tmp = new Dictionary<TKey, TValue>();
foreach (var key in keys)
{
TValue val;
if (target.TryGetValue(key, out val))
{
tmp.Add(key, val);
}
}
target.Clear();
foreach (var kvp in tmp)
{
target.Add(kvp.Key, kvp.Value);
}
}
例:
var d = new Dictionary<string, int>
{
{"A", 4},
{"B", 44},
{"bye", 56},
{"C", 99},
{"D", 46},
{"6672", 0}
};
var l = new List<string> {"A", "C", "D"};
d.RemoveAll(l);
foreach (var kvp in d)
{
Console.WriteLine(kvp.Key + ": " + kvp.Value);
}
出力:
A: 4
C: 99
D: 46
dict.Keys.Except(list).ToList()
.ForEach(key => dict.Remove(key));
両方の方法の長所と短所は何ですか? – guiomie
@guiomie旧wayは新しい辞書を構築するので、古いものはそのまま残していますが、メモリー占有量が増えてしまいます。後で、既存の辞書をインプレースで変更します。要するに、あなたが本当に巨大な辞書で操作していない場合、賛否両論はありません - プログラムの状態はこれらの2つの方法で同等ではありません。 – J0HN