【问题标题】:How to modify a foreach iteration variable from within foreach loop?如何从 foreach 循环中修改 foreach 迭代变量?
【发布时间】:2012-08-02 09:24:17
【问题描述】:

当我尝试这样做时......

Item[,] array = new Item[w, h];  // Two dimensional array of class Item, 
                                 //   w, h are unknown at compile time.
foreach(var item in array)
{
    item = new Item();
}

...我得到Cannot assign to 'item' because it is a 'foreach iteration variable'

不过,我还是想这样做。

这个想法是为现有项目分配默认的Item 类值。

【问题讨论】:

  • 你为什么不直接使用另一个变量?
  • var myItem; foreach (var item in twoDimArray) myItem = new Item();
  • 不清楚您真正想要实现的目标。您是否希望更改数组的内容?

标签: c# foreach iteration variable-assignment


【解决方案1】:

你可以使用普通的 for 循环。

【讨论】:

  • 它是一个二维数组,所以你可以找出长度,对吧?
【解决方案2】:

不知道大小不是问题:

for (int i = 0; i < twoDimArray.GetLength(0); i++)
{
    for (int j = 0; j < twoDimArray.GetLength(1); j++)
    {
        twoDimArray[i, j] = ...
    }
}

【讨论】:

    【解决方案3】:

    您似乎正在尝试初始化数组。 你不能这样做。相反,您需要按索引循环遍历数组。

    要初始化给定二维数组的元素,试试这个:

    for (int d = 0; d < array.GetLength(0); d++)
    {
        for (int i = 0; i < array.GetLength(1); i++)
        {
            array[d, i] = new Item();
        }
    }
    

    【讨论】:

      【解决方案4】:

      好的,既然我们知道了您的目标,而不是您尝试实现它的方式,那么回答您的问题就容易多了:您不应该使用foreach 循环。 foreach 是关于 读取 集合中的项目 - 不更改集合的内容。 C# 编译器将迭代变量设置为只读是一项很好的工作,否则它会让您更改 variable 的值而不会实际更改集合。 (必须进行更重大的更改才能反映更改...)

      我怀疑你只是想要:

      for (int i = 0; i < array.GetLength(0); i++)
      {
          for (int j = 0; j < array.GetLength(1); j++)
          {
              array[i, j] = new Item();
          }
      }
      

      假设它是一个矩形数组(Item[,])。如果它是Item[][],那么它就是一个数组数组,您的处理方式会略有不同——很可能使用foreach 进行外部迭代:

      foreach (var subarray in array)
      {
          for (int i = 0; i < subarray.Length; i++)
          {
              subarray[i] = new Item();
          }
      }
      

      【讨论】:

      • 让我们看看这个旧答案是否会引起注意。对于二维数组,您的答案是显而易见的,但对于 n 维数组有没有聪明的答案?
      • @LamdaComplex:你可以建立一个索引数组,并有效地增加它——或者使用递归。我建议您提出一个新问题,并提供一个简短但完整的示例来说明您要实现的目标。
      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2010-12-01
      • 2022-01-05
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      相关资源
      最近更新 更多