代码之家  ›  专栏  ›  技术社区  ›  Bob Horn

嵌套foreach-需要在每个级别对对象进行操作

c#
  •  0
  • Bob Horn  · 技术社区  · 9 年前

    我试图重构一些嵌套的 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
    }
    

    问题是文档和规则不再可以在循环中使用。有没有办法让他们使用这种方法?或者我应该只使用具有三个嵌套循环的第一个选项吗?

    我这里有一把小提琴: https://dotnetfiddle.net/oBMfQC

    1 回复  |  直到 9 年前
        1
  •  3
  •   D Stanley John Koerner    9 年前

    它们不可用,因为您只是在投影 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
    }
    

    这是否更可读或更不复杂,还有待商榷。它肯定不会更快或使用更少的内存。