我有多个相同类型的数组。我需要遍历每个元素以在每个元素上调用方法。
Foo[] array1;
Foo[] array2;
Foo[] array3;
我可以使用多个foreach
循环,如下所示:
void PerformAction()
{
foreach(var item in array1):
item.DoAction();
foreach(var item in array2):
item.DoAction();
foreach(var item in array3):
item.DoAction();
}
或将单个数组foreach
和concat
在一起:
void PerformAction()
{
foreach(var item in
array1.Concat(
array2.Concat(
array3)))
{
item.DoAction();
}
}
我认为concat
样式更简洁一些,需要更少的代码,但是一种方法相对于另一种方法有优势吗?
答案 0 :(得分:3)
为什么不只是将foreach
移入方法并调用x
次呢?
public void PerformActions()
{
PerformFooActions(array1);
PerformFooActions(array2);
PerformFooActions(array3);
}
private static void PerformFooActions(Foo[] foos)
{
foreach(var foo in foos)
foo.DoAction();
}
使用这种方法,将来很容易将代码转换为async
行为。您也不会生成多余的对象,这些对象以后需要进行GC处理,就像使用Concat
一样。
答案 1 :(得分:1)
三个foreach
语句将导致代码重复。将来,您的forbody会更复杂:
void PerformAction()
{
foreach(var item in array1)
{
// perfome some actions
// perfome some actions
// perfome some actions
// perfome some actions
item.DoAction();
}
foreach(var item in array2)
{
// perfome some actions
// perfome some actions
// perfome some actions
// perfome some actions
item.DoAction();
}
foreach(var item in array3)
{
// perfome some actions
// perfome some actions
// perfome some actions
// perfome some actions
item.DoAction();
}
}
您可以在任何foreach正文块中忘记或错印。
因此,将您的收藏集一并提取为一个:
void PerformAction()
{
var list = array1.Concat(array2).Concat(array3);
foreach(var item in list)
{
// perfome some actions
// perfome some actions
// perfome some actions
// perfome some actions
item.DoAction();
}
}
代码看起来更简洁