Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I clean up this LINQ Query (SelectMany)?

How can I clean up this LINQ Query to use SelectMany in the sql syntax, instead of method chaining at the end like I have done?

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

Edit: Turned into a tight little method:

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

Thanks!

like image 893
mkocubinski Avatar asked Dec 06 '25 09:12

mkocubinski


2 Answers

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

You can also use this if you prefer:

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

where Ipa is ipa's type and Pw is PeakWidth's type.

I have been reliably informed (haven't verified myself) that return-type inference for method groups has now been implemented in the compiler, so this should work in C# 4:

var runPeakWidths = runAnalysis.PassAnalyses.SelectMany(BuildPeakWidths);
like image 136
Ani Avatar answered Dec 08 '25 21:12

Ani


The SelectMany call can be avoided by nesting from clause in the query:

 var runPeakWidths =
      from ipa in runAnalysis.PassAnalyses
      from peakWidth in BuildPeakWidths(ipa)
      select peakWidth
like image 39
Elisha Avatar answered Dec 08 '25 23:12

Elisha