[英]Linq query returns values instead of setting values (With example) in C#
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)));
谢谢!
该列表是double
之一,它是.NET中的原始数据类型。 因此, ForEach
的i
将是初始值的副本,并且对其进行设置不会更改列表中的实际值。
为此,您必须使用旧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中的值数据类型。
一个简单高效的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();
首先, 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));
}
x => x % 3 == 0
这不会获得第三个项目,而是选择可以被3整除的项目。老实说,我必须查看%
行为方式,我认为它会返回一个double。然后您不希望将==
两个双精度值进行比较。
但是,正如您尚未说明的那样,列表是预先填充的,只是您希望将每个第3个项目随机化:
values = values
.Select((x, idx) => idx % 3 != 0 ? x : (double)RandomUtils.RandomFloat(1.0))
.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.