重新构造foreach循环并继续吗?

时间:2013-03-24 05:23:06

标签: c# refactoring

我试图重构一个很长的foreach循环。我陷入了困境,因为我在continue的几个地方。这是一些模仿原始代码的虚拟代码

IEnumerable<dynamic> allData = FetchAllData();
IEnumerable<dynamic> relativeData = FetchAllRelativData();

foreach (var rdata in relativeData)
{
    IEnumerable<dynamic> dataTobeProcessed = allData.Where(c => c.Name = rdata.Name);

    //Do something

    //if then Continue

    // do something

    //if then continue

    // do something

    // do something

    // add data to db
}

在这里,我删除了所有分离功能的部分。但是我的代码部分很少,其中包含continue,即打破循环并向前移动到下一个元素。所以,我无法将该部分分开。

同样,在这里,我有一些约束,就像步骤一直在继续。意味着第一件事发生在第二件,然后是第三件,然后是下一件......所以,我现在无法移动代码的位置。因为我的功能变得很大,大约300行,现在变得很难改变或维护。

请提供一个很好的解决方案,通过更改编码方式来删除continue或其他break方法。

如果需要任何其他详细信息,请与我们联系。

3 个答案:

答案 0 :(得分:2)

只需将if块重构为具有适当名称的单独函数即可 然后将所有ifs放在另一个而不是继续。

if (!something) 
{
  DoFirstThing();
  if (!otherthing)
  {
     DoSechondThing();
  }
} 
//continue implicitly happens here anyway.

答案 1 :(得分:2)

在循环开始时,设置一个布尔值 - 让我们将其称为escape为false。现在将continue的所有escape替换为true。这本身并不是真正的重构 - 它改变了现有代码的行为 - 但我们只是在中途完成。现在选择循环体(现在没有continue s),并将其作为方法提取。在提取的方法中,将escape的每个分配替换为return语句。消除escape变量的原始创建,并且您的代码处于更容易进一步重构的状态。

答案 2 :(得分:0)

你没有提到你的DoSomething()调用的if实现是否共享args和返回类型,如果它们是什么,另一种选择是创建一个包含你的DoSomething()逻辑的Func集合,而不是很多if语句,你可以循环Func实现,直到返回值指示你应该中断。

var somethingFuncs = new List<Func<x, bool>> 
{
  DoSomething,
  DoSomethingB,
  Blah....
};

foreach(var something in somethingFuncs)
{
  var result = something(arg);

  if (result)
  {
    break;
  } 
}