2009-03-04 9 views
0

J'ai une requête LINQ qui me donne une liste avec un certain nombre de listes d'enfants toutes avec des valeurs doubles.Comment gérer les listes d'enfants et obtenir de nouvelles listes d'objets en C# en utilisant LINQ?

Je souhaite obtenir un résultat de requête. Comment puis-je obtenir la première, la dernière, la plus haute et la plus faible valeur double?

Devrait-il s'agir d'un nouvel objet et les nouvelles valeurs de retour devraient-elles être une liste?

+0

Veuillez donner quelques exemples de code - il est difficile de comprendre quelle est votre situation en ce moment. –

+0

http://stackoverflow.com/questions/611441/c-linq-grouping-by-specific-timestamp-intervals je devrais commencer un nouveau fil .. –

+0

numsy, s'il vous plaît fournir un échantillon clair ici de ce que vous essayez Pour faire, je suis allé au lien mais je pense que ce que vous voulez dire dans ce post est perdu avec la situation que vous vouliez résoudre là-bas. – eglasius

Répondre

0

Votre question n'est pas très claire. Cependant, il semble que vous ayez une série d'objets de liste renvoyés à partir d'une requête LINQ et que vous souhaitiez obtenir des agrégats parmi les valeurs de toutes ces sous-listes. Je n'ai jamais vu un moyen de le faire dans LINQ, et honnêtement, je ne pense pas que la performance soit aussi bonne, même s'il y avait un moyen de le faire. Les agrégats que vous recherchez sont assez simples à calculer manuellement, avec une boucle. Quelque chose comme ceci:

double min = 200000000; 
double max = -200000000; 
double first = 0; 
double last = 0; 
bool hasFoundFirst = false; 
foreach (List<double> childList in queryResults) 
{ 
     foreach (double val in childList) 
     { 
      if (!hasFoundFirst) 
      { 
       hasFoundFirst = true; 
       first = val; 
      } 

      if (val < min) 
       min = val; 
      if (val > max) 
       max = val; 
      last = val; 
     } 
} 

Quelque chose comme ça vous donnera les résultats que vous recherchez une manière très efficace. Ce genre de chose, si vous pouvez le coder efficacement, a tendance à être plus rapide que LINQ. LINQ est génial et je l'utilise pour beaucoup de choses, mais ce n'est qu'un outil parmi tant d'autres.

1

il est vrai que la version codée à la main sera un peu plus rapide, mais à moins que vous sachiez que la performance est le problème clé de votre application, je ne m'en soucierais pas. La version LINQ du code ressemblerait à ceci:

IEnumerable<List<double>> queryResults = /*...*/ 

    var aggregates = 
    from ds in queryResults 
    select new { 
     First = ds[0], Last = ds[ds.Count - 1], 
     Lowest = ds.Min(), Highest = ds.Max() }; 

Je pense que cela est certainement plus facile à lire :-). Si l'objet imbriqué (ds) n'est pas de type List, vous devrez utiliser les méthodes d'extension First() et Last() au lieu de l'indexation directe.

Notez que si vous êtes intéressé par les performances, vous pouvez également utiliser Parallel LINQ, qui exécute la requête sur plusieurs threads. Pour la liste courte, il n'y a aucune raison réelle de le faire, mais si la collection est grande, elle peut vous donner de meilleures performances (mieux que la version codée à la main).

Questions connexes