我是LINQ的新手,并且不想过度使用并且难以维护这些代码.
你怎么看,这个LINQ查询太长了?
IList<ListViewItem> data = runAnalysis.PassAnalyses.Cast<PassAnalysis>().
Select(passAnalysis => passAnalysis.GetValue(PeakStatistics.PeakStatisticsProperty)).
SelectMany(peakStatistics => peakStatistics.Statistics.
Where(statisticsBase => statisticsBase.Name == statisticType).
Select(statisticsBase => new ListViewItem {Content = statisticsBase})).ToList();
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 10
我会说它由于嵌套而变得复杂 - 但实际上并不需要.这是一个查询的例子,它会给出相同的结果(我认为),但更简单......
IList<ListViewItem> data = runAnalysis.PassAnalyses
.Cast<PassAnalysis>()
.Select(pass => pass.GetValue(PeakStatistics.PeakStatisticsProperty))
.SelectMany(peakStats => peakStats.Statistics)
.Where(statisticsBase => statisticsBase.Name == statisticType)
.Select(statisticsBase => new ListViewItem {Content = statisticsBase})
.ToList();
Run Code Online (Sandbox Code Playgroud)
没有嵌套,很容易看出转换是如何进行的:
此时,很容易将其转换为查询表达式:
IList<ListViewItem> data =
(from PassAnalysis pass in runAnalysis.PassAnalyses
from statsBase in pass.GetValue(PeakStatistics.PeakStatisticsProperty)
.Statistics
where statsBase.Name == statisticType
select new ListViewItem { Content = statsBase })
.ToList();
Run Code Online (Sandbox Code Playgroud)
请注意,我已经省略了第一个Select和SelectMany; let如果你愿意,你可以使用一个条款.我还为pass范围变量使用了显式类型,以使编译器生成Cast<PassAnalysis >()调用.
这与原始版本略有不同,因为它将使用不同的形式SelectMany传播原始pass值,但结果将是相同的.
最后调用ToList()有点难看,因为它没有查询表达式语法...但你可以使用一个中间变量:
var query = ...;
IList<ListViewItem> data = query.ToList();
Run Code Online (Sandbox Code Playgroud)
IMO查询很好,虽然它看起来有些密集.您可以将其重新格式化以使其更加宽松:
var query = from analysis in runAnalysis.PassAnalyses.Cast<PassAnalysis>()
let value = analysis.GetValue(PeakStatistics.PeakStatisticsProperty)
from statistic in value.Statistics
where statistic.Name == statisticType
select new ListViewItem { Content = statistic };
IList<ListViewItem> data = query.ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
938 次 |
| 最近记录: |