2017-09-30 2 views
0

compte tenu de la source de données suivantes:LINQ et lambdas pour rechercher Dictionnaire> Classe> Liste> données Struct

public struct Strc 
{ 
    public decimal A; 
    public decimal B; 
    // more stuff 
} 

public class CLASS 
{ 
    public List<Strc> listStrc = new List<Strc>(); 
    // other stuff 
} 

Dictionary<string, CLASS> dict = new Dictionary<string, CLASS>(); 

je dois recueillir toutes les Strc.B dans le dictionnaire, fourni Strc.A est par exemple> 3.

-je obtenir le résultat procédant comme suit:

List<decimal> results = (
    from v in dizS.Values 
    from ls in v.listStr 
    where ls.A > 3 
    select ls.B 
    ).ToList(); 

J'ai aussi essayé de l'écrire en utilisant lambdas, mais je ne misérablement ...

var res = dict.Values.Where(x => x.listStrc.Any(z => z.A > 3)) 

c'est aussi loin que je pourrais obtenir, mais je ne parviens pas à sélectionner alors les données .B ... Qu'est-ce que je fais mal? (donné que j'ai fait quelque chose de bien en premier lieu: D) Merci pour votre temps.

+0

Votre expression de requête doit être ce que vous voulez. Je n'ai pas compris quel est ton problème avec ça? –

+0

Salut, celui sans lambdas fonctionne bien, je n'arrive pas à obtenir celui avec lambdas pour travailler. – Xarylem

Répondre

3

Vous êtes essentiellement à l'aplatissement d'une séquence des valeurs de structure - et cet aplatissement est représenté par SelectMany. Donc, vous voulez:

var res = dict.Values 
    .SelectMany(x => x.listSrc) 
    .Where(ls => ls.A > 3) 
    .Select(ls => ls.B); 

Ceci est essentiellement équivalent à l'expression de votre requête, mais vos tentatives d'appels de méthode suggère d'essayer d'obtenir un résultat différent, où se une des entrées de listSrc ont une valeur A supérieure à 3 , vous voudriez tous les des valeurs B de cela listSrc. Espérons que le premier est ce que vous voulez vraiment, mais il vaut la peine d'y réfléchir attentivement.

+1

Juste curieux, y a-t-il une différence entre cette réponse et la mienne? Je veux dire, dans ma réponse je filtre dans '' '' SelectMany''', vous filtrez dehors. Parce que tout ce qui est paresseux ne devrait pas faire beaucoup de différence, mais j'en doute. – tym32167

+0

@ tym32167: Non, je ne m'attendrais à aucune différence particulière. Je trouve la mienne plus simple à lire et à comprendre, mais la vôtre devrait fonctionner correctement. –

+0

hmm, j'ai fait quelques benchmarking et semble le mien code deux fois plus vite ... intéressant pourquoi – tym32167

3

Vous pouvez essayer cette

var result = dict.Values.SelectMany(x=>x.listStrc.Where(l=>l.A>3)).Select(x=>x.B);