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

时间:2016-07-07 01:12:00

标签: c# foreach iterator primitive

如果我的属性Ball的{​​{1}}属性为set,我可以使用{{1}设置radius个对象列表的半径循环:

Ball

但是,如果我正在迭代原始数据类型的集合,这不起作用,因为原语没有访问器。如果我尝试更改原始数据类型的值,我实际上是在迭代器上执行操作,而不是为自己赋值,所以以下内容不起作用:

foreach

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

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循环实现我想要的目标呢?

1 个答案:

答案 0 :(得分:7)

primitives(structs)是不可变的,并且作为值而不是指针传递。

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

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

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