2010-04-27 28 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);