gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:07:48 24 4
gpt4 key购买 nike

如果我有一个类Ballset其属性的访问器 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语法更具可读性,如果可以的话,我想这样做。由于我在上面详述的原因,以下内容不起作用:

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

那么,如何使用 foreach 实现我想要的效果?循环?

最佳答案

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

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

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

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

关于c# - 如何更改 foreach 迭代器引用的原始数据类型变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38236215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com