var values = new List<Double>();
/ * 使用大集(4500个数据点或更多)数据填充值 * /
我想要做的是将每个第三个数据点的值设置为随机浮点数。假设RandomUtils.RandomFloat(1.0)工作正常问题是以下linq查询似乎返回这些数据点的列表而不是更改列表值中的值。我怎么能做到这一点?
values
.Where(x => x % 3 == 0)
.ToList()
.ForEach(i => i = (double)(RandomUtils.RandomFloat(1.0)));
谢谢!
答案 0 :(得分:4)
该列表是double
中的一个,它是.NET中的原始数据类型。因此i
中的ForEach
将是初始值的副本,并且设置它不会更改列表中的实际值。
你必须使用一个好的旧for
。
for (int i = 0; i < values.Count; i++)
{
if (i % 3 == 0)
{
values[i] = RandomUtils.RandomFloat(1.0);
}
}
如果您需要,还可以使用i+=3
:
for (int i = 0; i < values.Count; i+=3)
{
values[i] = RandomUtils.RandomFloat(1.0);
}
其他数据类型(如结构体)也按值复制,这些是.Net中的值数据类型。
答案 1 :(得分:1)
简单有效的for循环:
for(int i = 0; i < values.Count; i+=3)
{
values[i] = (double)RandomUtils.RandomFloat(1.0);
}
或:
values = values
.Select((x, index) => index % 3 != 0 ? x : (double)RandomUtils.RandomFloat(1.0))
.ToList();
答案 2 :(得分:0)
首先ForEach
不是linq。
第二,当您致电ToList()
时,您正在创建一个新列表,因此其中的更改不会反映在原始列表中(values
)。
您只需使用for循环
即可for (int i = 0; i < values.Count; i++)
{
if (values[i] % 3 == 0)
values[i] = (double)(RandomUtils.RandomFloat(1.0));
}
答案 3 :(得分:0)
x => x % 3 == 0
这不会得到每一个第三项,而是选择可被3整除的项目。说实话,我必须查看%
对双打的行为,我认为返回一个double然后你不想将两个双精度数与==
进行比较。
但是你没有说明这个列表是预先填充的,只是你希望每个第3项都是随机的:
values = values
.Select((x, idx) => idx % 3 != 0 ? x : (double)RandomUtils.RandomFloat(1.0))
.ToList();