Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改foreach迭代器引用的基本数据类型变量的值_C#_Foreach_Iterator_Primitive - Fatal编程技术网

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

C# 如何更改foreach迭代器引用的基本数据类型变量的值,c#,foreach,iterator,primitive,C#,Foreach,Iterator,Primitive,如果我有一个类Ball,其属性radius具有set访问器,我可以使用foreach循环设置Ball对象列表的半径: foreach(Ball ball in balls) { ball.radius = 1; } 但是,如果我遍历一组基元数据类型,这将不起作用,因为基元没有访问器。如果我试图更改基元数据类型的值,我实际上是在迭代器上执行操作,而不是对其本身进行赋值,因此以下操作不起作用: foreach(double radius in radii) { radius = 1

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

foreach(Ball ball in balls)
{
    ball.radius = 1;
}
但是,如果我遍历一组基元数据类型,这将不起作用,因为基元没有访问器。如果我试图更改基元数据类型的值,我实际上是在迭代器上执行操作,而不是对其本身进行赋值,因此以下操作不起作用:

foreach(double radius in radii)
{
    radius = 1;
}
foreach (List<double> row in array)
{
    foreach (double value in row)
    {
        value /= normalisationFactor;
    }
}
我试着用指针解决它,如下所示:

double* p;
foreach(double radius in radii)
{
    p = &radius;
    *p = 1;
}
毫不奇怪,这不起作用,因为
p
指的是迭代器占用的地址,而不是变量


如果这在这里很重要,我将更具体地说明我实际要做的事情,尽管我仍然想回答我的主要问题,但很可能有一种更简单的方法可以使用
列表
,我不太熟悉。我有一个
列表
,我想修改它的每个元素,具体来说就是用一个归一化常数
normalisationFactor
除以每个元素。以下方法非常有效:

for (int i = 0; i < array.Count; i++)
{
    for (int j = 0; j < array[0].Count; j++)
    {
        array[i][j] /= normalisationFactor;
    }
}
那么,如何使用
foreach
循环实现我想要的呢?

原语(结构)是不可变的,并作为值而不是指针传递

IEnumerables不提供更新数据的方法

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

for (var i=0; i < radius.Count; i++)
    radius[i] = newValue
for(变量i=0;i
好的,看来我的解决方案(在倒数第二个代码块中)是最简单的。在接受你的建议之前,我会等着看是否有人给出不同的答案。干杯