BZ1*_*BZ1 3 c# foreach primitive iterator
如果我有一个Ball具有set其属性访问器的类radius,我可以Ball使用foreach循环设置对象列表的半径:
foreach(Ball ball in balls)
{
ball.radius = 1;
}
Run Code Online (Sandbox Code Playgroud)
但是如果我迭代一组原始数据类型,这不起作用,因为原语没有访问器.如果我尝试更改原始数据类型的值,我实际上是在迭代器上执行操作,而不是为自身值,所以以下方法不起作用:
foreach(double radius in radii)
{
radius = 1;
}
Run Code Online (Sandbox Code Playgroud)
我尝试用指针解决它,像这样:
double* p;
foreach(double radius in radii)
{
p = &radius;
*p = 1;
}
Run Code Online (Sandbox Code Playgroud)
不出所料,这不起作用,因为它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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现foreach语法更具可读性,并且如果可以的话我想这样做.由于我上面详述的原因,以下内容不起作用:
foreach (List<double> row in array)
{
foreach (double value in row)
{
value /= normalisationFactor;
}
}
Run Code Online (Sandbox Code Playgroud)
那么,如何使用foreach循环实现我想要的呢?
primitives(structs)是不可变的,并且作为值而不是指针传递.
IEnumerables不提供更新数据的方法.
如果您知道下划线数据类型(Array,Collection,List),只需循环位置索引并更新集合位置
for (var i=0; i < radius.Count; i++)
radius[i] = newValue
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |