J'ai besoin de sélectionner un certain nombre de valeurs (dans une liste) à partir d'un dictionnaire basé sur un sous-ensemble de clés.
J'essaie de le faire dans une seule ligne de code en utilisant Linq mais ce que j'ai trouvé jusqu'à présent semble assez long et maladroit. Quelle serait la façon la plus courte (la plus propre) de procéder?
Voici ce que j'ai maintenant (les clés sont des chaînes et keysToSelect est une liste de clés à sélectionner):
List<ValueType> selectedValues = dictionary1.Where(x => keysToSelect.Contains(x.Key))
.ToDictionary<String, valueType>(x => x.Key,
x => x.Value)
.Values.ToList;
Je vous remercie.
Eh bien, vous pouvez commencer à partir de la liste au lieu du dictionnaire:
var selectedValues = keysToSelect.Where(dictionary1.ContainsKey)
.Select(x => dictionary1[x])
.ToList();
Si toutes les clés sont garanties dans le dictionnaire, vous pouvez laisser de côté le premier Where
:
var selectedValues = keysToSelect.Select(x => dictionary1[x]).ToList();
Notez que cette solution est plus rapide que d'itérer le dictionnaire, surtout si la liste des clés à sélectionner est petite par rapport à la taille du dictionnaire, car Dictionary.ContainsKey
est beaucoup plus rapide que List.Contains
.
UNE Dictionary<TKey,TValue>
est IEnumerable<KeyValuePair<TKey,TValue>>
, vous pouvez donc simplement Select
la propriété Value
:
List<ValueType> selectedValues = dictionary1
.Where(x => keysToSelect.Contains(x.Key))
.Select(x => x.Value)
.ToList();
ou
var selectValues = (from keyValuePair in dictionary1
where keysToSelect.Contains(keyValuePair.Key)
select keyValuePair.Value).ToList()
Si vous savez que toutes les valeurs que vous souhaitez sélectionner se trouvent dans le dictionnaire, vous pouvez parcourir les clés au lieu de parcourir le dictionnaire:
List<ValueType> selectedValues = keysToSelect.Select(k => dictionary1[k]).ToList();