繁体   English   中英

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

[英]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中的原始数据类型。 因此, ForEachi将是初始值的副本,并且对其进行设置不会更改列表中的实际值。

为此,您必须使用旧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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM