38

キーのサブセットに基づいて、ディクショナリからいくつかの値を (リストに) 選択する必要があります。

Linq を使用して 1 行のコードでこれを実行しようとしていますが、これまでに見つけたものは非常に長くて扱いにくいようです。これを行うための最短の(最もクリーンな)方法は何ですか?

これは私が今持っているものです (キーは文字列で、keysToSelect は選択するキーのリストです):

List<ValueType> selectedValues = dictionary1.Where(x => keysToSelect.Contains(x.Key))
                                            .ToDictionary<String, valueType>(x => x.Key,
                                                                             x => x.Value)
                                            .Values.ToList;

ありがとうございました。

4

4 に答える 4

70

辞書の代わりにリストから始めることもできます:

var selectedValues = keysToSelect.Where(dictionary1.ContainsKey)
                     .Select(x => dictionary1[x])
                     .ToList();

すべてのキーがディクショナリにあることが保証されている場合は、最初のキーを省略できますWhere

var selectedValues = keysToSelect.Select(x => dictionary1[x]).ToList();

特に、選択するキーのリストがディクショナリのサイズに比べて小さい場合、このソリューションはディクショナリを反復するよりも高速であることに注意してDictionary.ContainsKeyくださいList.Contains

于 2012-09-22T15:16:01.520 に答える
9

ADictionary<TKey,TValue>はであるため、プロパティIEnumerable<KeyValuePair<TKey,TValue>>を単純化できます。SelectValue

 List<ValueType> selectedValues = dictionary1
           .Where(x => keysToSelect.Contains(x.Key))
           .Select(x => x.Value)
           .ToList();

また

 var selectValues = (from keyValuePair in dictionary1
                     where keysToSelect.Contains(keyValuePair.Key)
                     select keyValuePair.Value).ToList()
于 2012-09-22T15:15:43.750 に答える
3

選択するすべての値がディクショナリにあることがわかっている場合は、ディクショナリをループする代わりに、キーをループすることができます。

List<ValueType> selectedValues = keysToSelect.Select(k => dictionary1[k]).ToList();
于 2012-09-22T15:22:10.863 に答える