【问题标题】:Iterate two Arrays with ForEach statement in C# [duplicate]在 C# 中使用 ForEach 语句迭代两个数组 [重复]
【发布时间】:2014-06-30 06:52:27
【问题描述】:

我有 2 个数组

string[] Namesvalues = Names.Split(',');
string[] TotalValues = Total.Split(',');

以上两个数组具有完全相同的值。我想要做的是并行迭代两个数组以上,并希望从两个数组中一一获取值。

谁能告诉我该怎么做??

【问题讨论】:

  • “两个数组的值完全相同”,我假设您是说它们具有相同数量的元素?
  • @Dirk 是的,两者都具有相同数量的元素
  • 使用普通的for循环并使用迭代器访问数组不是更容易吗?检查后长度是一样的。假设您想比较使用它们。
  • 您可以使用典型的 for 循环而不是 foreach...您正在寻找 foreach 解决方案或者您只是想迭代的任何原因?
  • Duplicate 为您的确切问题提供答案。请注意,最好创建自定义类 (Name,Total) 而不是 2 个单独的数组或简单地使用 for 循环。

标签: c#


【解决方案1】:

您可以简单地使用for-loop:

for(int i = 0; i < NamesValues.Length; i++)
{
    string name = NamesValues[i];
    string totalValue = TotalValues[i];
}

如果长度不同,您可以使用ElementAtOrDefault:

for(int i = 0; i < Math.Max(NamesValues.Length, TotalValues.Length) ; i++)
{
    string name = NamesValues.ElementAtOrDefault(i);
    string totalValue = TotalValues.ElementAtOrDefault(i);
}

您也可以使用Enumerable.Zip 创建一个具有两个值的匿名类型:

var namesAndValues = NamesValues.Zip(TotalValues, 
    (n, tv) => new { Name = n, TotalValue = tv });
foreach(var nv in namesAndValues)
{
    Console.WriteLine("Name: {0} Value: {1}", nv.Name + nv.TotalValue);
}

请注意,使用for-loopElementAtOrDefault 的第二种方法与Enumerable.Zip 方法不同。

  • 前者迭代两个数组完全,如果该索引处没有元素,ElementAtOrDefault 将返回null 以获取较小数组的值。
  • 后者Zip 仅组合元素直到它到达其中一个序列的末尾

因此,当您在 for 循环中使用 Math.Min 而不是 Math.Max 时,您会得到类似的行为,但无论如何您都应该使用第一种方法,因为不需要 ElementAtOrDefault

【讨论】:

    【解决方案2】:
    //exactly equal length
    for (int i = 0; i < Namesvalues.Length; i++)
    {
        var name = Namesvalues[i];
        var total = TotalValues[i];
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多