如何更改 foreach 迭代器引用的基元数据类型变量的值

本文关键字:元数据 类型变量 引用 何更改 foreach 迭代器 | 更新日期: 2023-09-27 17:55:55

如果我有一个类Ball,其属性radius带有set访问器,我可以使用foreach循环设置Ball对象列表的半径:

foreach(Ball ball in balls)
{
    ball.radius = 1;
}

但是,如果我循环访问基元数据类型的集合,这不起作用,因为基元没有访问器。如果我尝试更改基元数据类型的值,我实际上是在迭代器上执行操作,而不是值本身,因此以下内容不起作用:

foreach(double radius in radii)
{
    radius = 1;
}

我尝试用指针解决它,如下所示:

double* p;
foreach(double radius in radii)
{
    p = &radius;
    *p = 1;
}

不出所料,这不起作用,因为p指的是迭代器占用的地址,而不是变量。


如果这里很重要,我将更具体地说明我实际要做的事情,尽管我仍然想回答我的主要问题,但很可能有一种更简单的方法可以使用我不太熟悉的List<>方法做到这一点。我有一个List<List<double>>,我想改变每个元素,特别是通过将每个元素除以一个归一化常数normalisationFactor。以下工作完美:

for (int i = 0; i < array.Count; i++)
{
    for (int j = 0; j < array[0].Count; j++)
    {
        array[i][j] /= normalisationFactor;
    }
}

但是,我发现foreach语法更具可读性,如果可以的话,我希望这样做。由于我上面详述的原因,以下方法不起作用:

foreach (List<double> row in array)
{
    foreach (double value in row)
    {
        value /= normalisationFactor;
    }
}

那么,如何使用foreach循环实现我想要的东西呢?

如何更改 foreach 迭代器引用的基元数据类型变量的值

元(结构)是不可变的,并且作为值而不是指针传递。

IEnumerables 不提供更新数据的方法。

如果您知道下划线数据类型(数组、集合、列表),只需循环位置索引并更新集合位置

for (var i=0; i < radius.Count; i++)
    radius[i] = newValue