使用Concat和Foreach遍历多个集合

时间:2019-05-07 02:53:37

标签: c#

我有多个相同类型的数组。我需要遍历每个元素以在每个元素上调用方法。

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();
}

或将单个数组foreachconcat在一起:

void PerformAction()
{
    foreach(var item in
        array1.Concat(
        array2.Concat(
        array3)))
    {
        item.DoAction();
    }
}

我认为concat样式更简洁一些,需要更少的代码,但是一种方法相对于另一种方法有优势吗?

2 个答案:

答案 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();
    }
}

代码看起来更简洁