Проблемы с лямбда-выводом c # - PullRequest
2 голосов
/ 26 февраля 2012

Я написал такой код:

System.IO.File.ReadAllLines("c://test.txt")
   .Select(val => Console.WriteLine(val)
);

И я получаю ошибку компилятора:

Аргументы типа для метода «System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable, System.Func) 'не может быть выведено из использования. Попробуйте указать аргументы типа явно.

WriteLine может принимать строку и объект в качестве параметра, это, вероятно, источник ошибки, но как мне ее переписать?

Ответы [ 4 ]

7 голосов
/ 26 февраля 2012

Метод Select принимает Func<TSource, TResult>, но тип возвращаемого значения Console.WriteLine равен void, т. Е. Вообще никакого значения.Таким образом, в этом случае TResult будет void, и, очевидно, тип возвращаемого значения Select не может быть IEnumerable<void> (т. Е. "Последовательность из ничего" ...)

Лямбдавыражение, переданное Select , имеет для возврата значения.Если вы просто хотите напечатать результат File.ReadAllLines, используйте цикл for или foreach.

3 голосов
/ 26 февраля 2012
File.ReadAllLines(@"c://test.txt").ToList().ForEach(Console.WriteLine);
3 голосов
/ 26 февраля 2012

Вы можете исправить это с помощью этого кода:

System.IO.File.ReadAllLines("c://test.txt")
   .Select(val => {Console.WriteLine(val); return val;})

или

System.IO.File.ReadAllLines("c://test.txt")
   .ToList().ForEach(val => Console.WriteLine(val));
0 голосов
/ 26 февраля 2012

Этот ответ включает в себя краткое изложение других ответов.

Нет проблем с типом параметра, проблема в том, что метод Select должен возвращать значение, и его не следует использовать в этом случае. ForEach будет правильным методом, но он есть только у List, а не у каждого IEnumerable. Итак:

System.IO.File.ReadAllLines("c://test.txt")
.ToList()
.ForEach(val => Console.WriteLine(val));

добьется цели (хотя и понесет некоторые издержки при преобразовании в список).

Есть еще один способ: статический метод Array.ForEach. Поэтому мой код будет выглядеть так:

Array.ForEach(
System.IO.File.ReadAllLines("c://test.txt"), val => Console.WriteLine(val)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...