2016-03-15 20 views
1
var values = new List<Double>(); 

/* 填充值与大组设定值(带有示例)(4500个数据点以上)的数据 */的LINQ查询返回的,而不是在C#

我想要做的就是价值观将每个第三个数据点的值设置为随机浮点数。只要假设RandomUtils.RandomFloat(1.0)工作正常问题是,下面的linq查询似乎返回这些数据点的列表,而不是更改我的列表值中的值。我怎样才能做到这一点?

values 
    .Where(x => x % 3 == 0) 
    .ToList() 
    .ForEach(i => i = (double)(RandomUtils.RandomFloat(1.0))); 

谢谢!

+0

你为什么不使用一个简单的循环? –

+0

改为使用'for'循环(分配给'values [index]'将更新列表)。 – crashmstr

+3

'd也喜欢简单的循环。请记住,LINQ是一个_functional_编程框架。它的总体目标是从其他值中返回值/集合,并且不引起副作用。 afaik“Q”代表_query_,“LINQ”中没有“A”动作。 –

回答

4

该列表是一个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); 
} 

其他数据类型,例如结构也被复制值,这些都是净值的数据类型。

+0

您可以使用'i + = 3'并省略%-check –

+1

这正是我在第一次pre-linq尝试时所做的。正如Rene Vogt所说,这是一种查询语言,而不是行为语言。 :) – Maderas

+1

这是一个很好的方式来表达它。 LINQ是一种查询语言,而不是一个动作。 – mrahhal

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(); 
+0

我可以建议你使用'Select((i,x)=> i%3')过载,所以你不是'%'的双精度表。他们也没有声明这个表是预先填充了索引。 – weston

+0

这是我确切的第一次尝试!:)我想给linq一个尝试,但也许这里不适合。 :) – Maderas

+0

@weston:好点 –

0

ForEach所有的首先是不LINQ。 第二次当您拨打ToList()时,您正在创建一个新列表,因此其中的更改不会反映在原始列表(values)中。

你可以简单地用做对循环

for (int i = 0; i < values.Count; i++) 
{ 
    if (values[i] % 3 == 0) 
     values[i] = (double)(RandomUtils.RandomFloat(1.0)); 
} 
+1

有趣!我一直认为列表中的ForEach方法是linq表达式,但正如我现在看到的那样,它不是IEnumerable的扩展方法!第二部分在本文中解释为:LINQ ...不LINA(查询不行动!):)谢谢! – Maderas

0

x => x % 3 == 0这并不让每一个第三个项目,但由3并整除选择项目说实话,我不得不仰视%如何表现双打,我认为它返回一倍,然后你不想比较两个双打==

但你有没有规定的列表是预填充,只是你要每3个项目被随机分配:

values = values 
    .Select((x, idx) => idx % 3 != 0 ? x : (double)RandomUtils.RandomFloat(1.0)) 
    .ToList(); 
+0

我明白你在做什么。我用它,但它没有奏效。价值偏向最左边!当我使用一个简单的循环,它的工作....嗯...这看起来很有希望! – Maderas

+0

嗯,在某个时候,我确实有'(x,idx)'错误的顺序。确保它是这样的顺序。 – weston