我试图重构一些嵌套的foreach
循环,但遇到了一个问题。这是原始代码:
foreach(var doc in customTrackerDocuments)
{
foreach(var rule in doc.Rules)
{
foreach(var eval in rule.Evaluations)
{
// Do something with customTrackerDocuments, rules, and evaluations
// doc, rule, and eval are all available here
}
}
}
诚然,它是干净而直截了当的,所以也许它应该保持这样。然而,我一直试图降低复杂性和增加可读性,所以我尝试了以下几点:
foreach(var eval in customTrackerDocuments.SelectMany(doc => doc.Rules).SelectMany(rule => rule.Evaluations))
{
// Do something with customTrackerDocuments, rules, and evaluations
// doc and rule are NOT available here
}
问题是,在循环中不再可以使用doc和规则。是否有一种方法可以让他们使用这种方法?还是我应该使用第一个选项,其中有三个嵌套循环?
我这里有个小提琴:https://dotnetfiddle.net/oBMfQC
发布于 2015-07-30 16:18:19
它们是不可用的,因为您只是将rule.Evaluations
投影到您的最终SelectMany
中。您可以构建一个匿名类型:
foreach(var eval in customTrackerDocuments.SelectMany(doc => doc.Rules, rule => new {doc, rule})
.SelectMany(docrule => docrule.rule.Evaluations, eval => new {docrule.doc, docrule.rule, eval}))
{
// eval.doc, eval,rule, eval.eval are available here
}
这是否更易读或不那么复杂是值得商榷的。当然,它不会更快,也不会占用更少的内存。
https://stackoverflow.com/questions/31728919
复制相似问题