Linq查询返回值而不是在C#中设置值(带示例)

时间:2016-03-15 14:11:18

标签: c# linq list

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)));

谢谢!

4 个答案:

答案 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();