最佳实践:嵌套ForEach

时间:2013-04-16 12:14:37

标签: c# nested-loops

嵌套“foreach”的数量是否有最佳实践?

那就是我在复杂字典中嵌套“foreach”,是否有一点它开始产生“可能”阻碍性能的开销?这是否值得考虑。

使其具体而不是主观: 我有3个复杂词典,看起来像这样;

Dictionary<int, Dictionary<string, XObject>()
Dictionary<string, List<YObject>()
Dictionary<string, Dictionary<string, List<ZObjects>()

显然现在,当我过滤这些词典(在foreach中)时,为了生成我正在寻找的数据,我的代码的结构朝向5嵌套“foreach”排除外部1。在回答这些是我担心的地方可能会受到影响:

  1. 效果(上下文切换次数过多)
  2. 内存(在给定时刻保留内存中的所有数据集)
  3. 可维护性(糟糕的程序员!)
  4. 最佳做法还是无所谓?

2 个答案:

答案 0 :(得分:4)

  1. foreach语句没有“上下文切换”。
  2. 内存:完全不相关,内存是由数据而不是由枚举器(由foreach语句使用)
  3. 可维护性:考虑重构代码,添加执行项目的方法

答案 1 :(得分:3)

实现这一目标的一种简明扼要的方法是在功能上将它们分开。考虑:

// represents outer loop
IEnumerable<KeyValuePair<string, string>> Operation1(IEnumerable<KeyValuePair<string, string>> input)
{
   // outer loop processing
   IEnumerable<KeyValuePair<string, string>> output = Operation2(input);
   return output;
}

// which feeds in to...

IEnumerable<KeyValuePair<string, string>> Operation2(IEnumerable<KeyValuePair<string, string>> input)
{
    // work on it
   IEnumerable<KeyValuePair<string, string>> output = Operation3(input);
   return output;
}

// and finally

IEnumerable<KeyValuePair<string, string>> Operation3(IEnumerable<KeyValuePair<string, string>> input)
{
    // work on it
    return input;
}

这样可以使循环的功能分离,顺序可以改变,每个循环都是一个谨慎的工作单元。