Что не так с приведенным ниже лямбда-выражением для умножения (C # 3.0) - PullRequest
1 голос
/ 27 апреля 2010
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 ]

6 голосов
/ 27 апреля 2010

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 голосов
/ 27 апреля 2010

Попробуйте вместо:

List<double> d1 = y.Select(i => i * 2).ToList();
1 голос
/ 27 апреля 2010

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);
0 голосов
/ 27 апреля 2010
List<double> d1 = y.ForEach(i => i = i * 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...