2010-09-04 4 views
3

Comment puis-je nettoyer cette requête LINQ pour utiliser SelectMany dans la syntaxe sql, au lieu de chaîner la méthode à la fin comme je l'ai fait?Comment puis-je nettoyer cette requête LINQ (SelectMany)?

var runPeakWidths = 
    (from ipa in runAnalysis.PassAnalyses 
     let peakWidths = BuildPeakWidths(ipa) 
     select peakWidths) 
     .SelectMany(data => data); 

Edit: Tourné dans une petite méthode serrée:

public void CreateRunStatistics(Func<IPassAnalysis, IEnumerable<double>> buildMethod, string name) 
    { 
     var data = runAnalysis.PassAnalyses.SelectMany(buildMethod); 
     statistics.Add(StatisticsBase.Calc(name, data)); 
    } 

Merci!

+2

S'il vous plaît me dire IPA est India Pale Ale ... s'il vous plaît. – tvanfosson

+0

Lol, pas plus :) – mkocubinski

Répondre

5
var runPeakWidths = runAnalysis.PassAnalyses.SelectMany(ipa => BuildPeakWidths(ipa)); 

Vous pouvez également utiliser si vous préférez:

var runPeakWidths = runAnalysis.PassAnalyses.SelectMany<Ipa, Pw>(BuildPeakWidths); 

Ipa est ipa 'type de et Pw est PeakWidth' type s.

Je suis source sûre (ne me suis pas vérifié) que l'inférence de type de retour pour les groupes de la méthode a été mis en œuvre dans le compilateur, donc cela devrait fonctionner en C# 4:

var runPeakWidths = runAnalysis.PassAnalyses.SelectMany(BuildPeakWidths); 
+0

Ah oui, la solution simple me sauve, merci. – mkocubinski

4

Le SelectMany appel peut être évité par emboîtement from clause dans la requête:

var runPeakWidths = 
     from ipa in runAnalysis.PassAnalyses 
     from peakWidth in BuildPeakWidths(ipa) 
     select peakWidth 
+1

Bon de voir comment utiliser sélectionner beaucoup dans ce contexte. – mkocubinski

Questions connexes