2010-04-27 30 views
1
List<double> y = new List<double> { 0.4807, -3.7070, -4.5582, 
            -11.2126, -0.7733, 3.7269, 
             2.7672, 8.3333, 4.7023 }; 

List<double> d1 = y.ForEach(i => i * 2); 

錯誤:只有分配,調用,遞增,遞減和新對象表達式可以用作聲明有什麼不對乘法下面的lambda表達式(C#3.0)

是什麼錯誤?

感謝

回答

6

List<T>.ForEach不會執行轉換:它執行的每個項目給定的委託,但僅此而已。這就是爲什麼它有一個void返回類型 - 爲什麼參數類型是Action<T>而不是像Func<T, TResult>。最後一部分就是爲什麼你有一個編譯錯誤。你基本上試圖做到:

Action<double> = i => i * 2; 

這會給你相同的編譯錯誤。

如果你想在List<T>方法中粘(例如,因爲你正在使用.NET 2.0),您可以使用List<T>.ConvertAll

List<double> d1 = y.ConvertAll(i => i * 2); 
6

嘗試,而不是:

List<double> d1 = y.Select(i => i * 2).ToList(); 
+0

它工作正常。但是,什麼是錯的上述..請解釋 – Newbie 2010-04-27 07:44:24

+0

'ForEach'採取行動'' - 它沒有返回值的函數。 – 2010-04-27 07:45:33

+0

你只是放棄乘法的結果。作爲結果,代碼中沒有任何內容將它們放入列表中。 – 2010-04-27 07:45:50

-2
List<double> d1 = y.ForEach(i => i = i * 2); 
+0

這將對名單上絕對沒有任何影響。 'i'等價於一個函數參數;修改'我'只是修改本地,而不是列表中包含的值。 – 2010-04-27 07:45:00

+0

對不起。它沒有y.ForEach(i => i = i * 2); – Newbie 2010-04-27 07:47:26

1

List.Foreach需要一個Action<>代表不返回任何東西,所以你不能用它來創建一個新的列表。正如其他人所指出的,使用ForEach並不是這裏最好的選擇。如何使用ForEach執行操作的示例可能有助於理解爲什麼:

List<double> y = new List<double> { 0.4807, -3.7070, -4.5582, 
            -11.2126, -0.7733, 3.7269, 
             2.7672, 8.3333, 4.7023 }; 

List<double> d1 = new List<double>(); 

Action<double> a = i => d1.Add(i*2); 
y.ForEach(a);