14

私はディクショナリを持っています。アイテムは(たとえば)次のとおりです。

  1. "あ"、4
  2. "B"、44
  3. 「さようなら」、56
  4. "C"、99
  5. "D"、46
  6. "6672", 0

そして、私はリストを持っています:

  1. 「あ」
  2. "C"
  3. "D"

キーがリストにないすべての要素を辞書から削除したいのですが、最後に辞書は次のようになります。

  1. "あ"、4
  2. "C"、99
  3. "D"、46

どのようにできるのか?

4

4 に答える 4

22

リストにある要素を含む新しい Dictionary を作成する方が簡単です。

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「コレクションが変更されました」などの例外が発生する可能性があります。

于 2012-11-25T16:31:32.643 に答える
8
// 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);
于 2012-11-25T16:25:18.587 に答える
4
dict.Keys.Except(list).ToList()
    .ForEach(key => dict.Remove(key));
于 2012-11-25T17:24:14.367 に答える
0

コード:

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
于 2012-11-25T16:25:41.760 に答える