我试图重构一个很长的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
方法。
如果需要任何其他详细信息,请与我们联系。
答案 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;
}
}