【问题标题】:How to iterate through multiple arrays using one loop?如何使用一个循环遍历多个数组?
【发布时间】:2020-11-27 18:46:37
【问题描述】:

我有多个相同类型的数组(目前是 2 个),我需要对这些数组执行类似的操作。

Custom[] array1 = new Custom[10];
Custom[] array2 = new Custom[20];

// Assign values to array1 and array2

foreach(var v in array1)
{
// Do some operations
}

foreach(var v in array2)
{
// Do some operations
}

foreach loops 中,我都在对数组中的对象进行类似的操作。 这些操作确实会根据条件修改数组中对象的某些属性。

有什么方法可以合并foreach loops? 我想维护两个数组,因为它们在进程结束时,所以不能将一个数组复制到另一个数组或类似的东西。我还想避免创建一个包含两个合并数组的新数组(我认为这可能会导致空间问题,因为此处的自定义可以是值类型或引用类型)。

我发现的一个解决方案是拥有一个包含foreach loop 的单独函数,然后为多个数组调用该函数。

private void DoOperations(Custom[] array)
{
    foreach(var v in array)
    {
    // Do some operations
    }
}

// In main
DoOperations(array1);
DoOperations(array2);

我只是想知道是否有任何其他方法可以实现这一点,因为我需要更多这样的foreach loops,其中一些包含非常琐碎的代码。

【问题讨论】:

  • “我发现的一个解决方案是使用一个包含 foreach 循环的单独函数,然后为多个数组调用该函数。”这是最好的解决方案,因为它减少了代码重复。对未来的读者来说非常清楚。
  • @HimBromBeere 我目前使用的是相同的。虽然我包含更多类似的 foreach 循环,但它们可能包含的代码非常少,例如将单个属性值增加一或这样。每一个这样的操作都需要一个单独的函数,这有点矫枉过正。
  • 将单独的任务提取到一个函数中永远不会过分,恕我直言,因为它使您的代码更清晰,更容易理解。因此,即使您仅在单个位置调用该代码,也值得考虑将其重构为自己的方法。除此之外,您总是可以考虑将所有 相似的东西重构为一个通用结构 - 例如一个方法,为了不重复自己。
  • 是的,这种更好更干净的方法,请发布您的代码作为答案。
  • @Jasmeet 如前所述,函数可能是解决此问题的最佳方法。还要考虑当另一个人必须维护您的代码并且必须搜索特定的 foreach 循环来更改某些内容时是什么情况。如果你选择一个“好”的函数名,那么函数会更清楚你在循环中所做的事情。

标签: c# arrays loops


【解决方案1】:
Custom[] array1 = new Custom[10];
Custom[] array2 = new Custom[20];

var arr = arr1.Union(arr2).ToArray();

foreach(var v in array)
{
    // Do some operations
}

【讨论】:

  • 如果数组包含值类型,这将如何工作?我认为它不会自动更新原始数组中的任何值。
  • 它不适用于任何实现 IEquitable 的重复引用
【解决方案2】:

请看下面的实现

 public Func<custom[], custom[]> performOperation { get; set; }
 public custom[] iterateArray(custom[] arg)
        {
            foreach (var item in arg)
            {
                //Do operation
            }

            return arg;
        }

然后您可以将委托分配给 iterateArray 方法并调用它,请参见下文

    performOperation = iterateArray;
    performOperation(new custom[]{});

通过这种方式,您可以为多个相同类型的数组调用委托,如果要更改任何数组的操作逻辑,您可以实现一个遵守委托签名的方法并将其分配给委托。

【讨论】:

  • 这只是创建了一个额外的委托,用于调用我需要调用的函数。我宁愿调用我的函数而不是引入一个新的委托来做同样的事情。
猜你喜欢
  • 2010-10-24
  • 2011-08-28
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2013-11-06
  • 2022-01-27
相关资源
最近更新 更多