如何更改 foreach 迭代器引用的原始数据类型变量的值
How to change the value of a primitive data type variable referred to by a foreach iterator
如果我有一个 class Ball
及其 属性 radius
的 set
访问器,我可以设置 [= =15=] 个对象使用 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
语法更具可读性,如果可以的话,我想这样做。由于我上面详述的原因,以下不起作用:
foreach (List<double> row in array)
{
foreach (double value in row)
{
value /= normalisationFactor;
}
}
那么,如何使用 foreach
循环实现我想要的效果?
基元(结构)是不可变的,并作为值而不是指针传递。
IEnumerables 不提供更新数据的方法。
如果知道下划线数据类型(数组、集合、列表),只需循环位置索引并更新集合位置
for (var i=0; i < radius.Count; i++)
radius[i] = newValue
如果我有一个 class Ball
及其 属性 radius
的 set
访问器,我可以设置 [= =15=] 个对象使用 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
语法更具可读性,如果可以的话,我想这样做。由于我上面详述的原因,以下不起作用:
foreach (List<double> row in array)
{
foreach (double value in row)
{
value /= normalisationFactor;
}
}
那么,如何使用 foreach
循环实现我想要的效果?
基元(结构)是不可变的,并作为值而不是指针传递。
IEnumerables 不提供更新数据的方法。
如果知道下划线数据类型(数组、集合、列表),只需循环位置索引并更新集合位置
for (var i=0; i < radius.Count; i++)
radius[i] = newValue