以下用于乘法的lambda表达式有什么问题(C#3.0)

时间:2010-04-27 07:39:53

标签: c#-3.0

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);

错误:只能将赋值,调用,递增,递减和新对象表达式用作语句

有什么问题?

谢谢

4 个答案:

答案 0 :(得分:6)

尝试改为:

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

答案 1 :(得分: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);

答案 2 :(得分: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);

答案 3 :(得分:-2)

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