2016-03-15 19 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