web-dev-qa-db-ja.com

Linqを使用してできるだけ簡単に辞書から複数の値を選択する方法

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

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

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

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

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

25
Peladao

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

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

すべてのキーが辞書にあることが保証されている場合、最初のWhereを省くことができます:

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

このソリューションは、特に選択するキーのリストが辞書のサイズと比較して小さい場合、Dictionary.ContainsKeyList.Contains

54
verdesmarald

Dictionary<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()
7
jeroenh

選択するすべての値が辞書にあることがわかっている場合、辞書をループする代わりにキーをループすることができます。

List<ValueType> selectedValues = keysToSelect.Select(k => dictionary1[k]).ToList();
3
Guffa