8

値が空のリストである辞書からアイテムを削除する最良の方法は何ですか?

IDictionary<int,Ilist<T>> 
4

3 に答える 3

22
var foo = dictionary
    .Where(f => f.Value.Count > 0)
    .ToDictionary(x => x.Key, x => x.Value);

これにより、新しい辞書が作成されます。インプレースで削除したい場合は、ジョンの答えがうまくいきます。

于 2013-05-02T14:38:12.870 に答える
17

これをその場で実行する必要がある場合は、次を使用できます。

var badKeys = dictionary.Where(pair => pair.Value.Count == 0)
                        .Select(pair => pair.Key)
                        .ToList();
foreach (var badKey in badKeys)
{
    dictionary.Remove(badKey);
}

または、新しい辞書を作成することに満足している場合:

var noEmptyValues = dictionary.Where(pair => pair.Value.Count > 0)
                              .ToDictionary(pair => pair.Key, pair => pair.Value);

ディクショナリの構築方法を変更する機会があればILookup、メソッドを使用して代わりに を作成することを検討できることに注意してくださいToLookup。概念的には非常に似ていますが、通常、各値がリストである辞書よりも単純です。ルックアップには、存在しないキーを要求すると、例外や null 参照の代わりに空のシーケンスが返されるという優れた機能があります。

于 2013-05-02T14:38:06.557 に答える
0

完全を期すために提供された代替手段。

または (完全に使用状況に応じて)、特定の時点でのバッチではなく、その場でリストの内容を修正する時点で行います。このようなときは、反復しなくてもキーがわかる可能性があります。

var list = dictionary[0];

// Do stuff with the list.

if (list.Count == 0)
{
    dictionary.Remove(0);
}

他の回答は、辞書全体でアドホックに行う必要性に対処しています。

于 2013-05-02T14:47:01.983 に答える