web-dev-qa-db-fra.com

Comment sélectionner plusieurs valeurs dans un dictionnaire en utilisant Linq aussi simple que possible

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.

25
Peladao

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.

54
verdesmarald

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

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();
3
Guffa