我写了这样的代码:
System.IO.File.ReadAllLines("c://test.txt")
.Select(val => Console.WriteLine(val)
);
我收到编译错误:
方法的类型参数 “System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable, System.Func)'无法从用法中推断出来。 尝试明确指定类型参数。
WriteLine可以接受字符串和对象作为参数,这可能是错误的来源,但我该如何重写呢?
答案 0 :(得分:7)
Select
方法需要Func<TSource, TResult>
,但Console.WriteLine
的返回类型为void
,即根本没有值。因此,在这种情况下,TResult
将是void
,显然,Select
的返回类型不能是IEnumerable<void>
(即“一系列无关”......)
传递给Select
的lambda表达式返回一个值。如果您只想打印File.ReadAllLines
的结果,请使用for
或foreach
循环。
答案 1 :(得分:3)
您可以通过以下代码修复它:
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));
答案 2 :(得分:3)
File.ReadAllLines(@"c://test.txt").ToList().ForEach(Console.WriteLine);
答案 3 :(得分:0)
此答案包括其他答案的摘要。
参数类型没有任何问题,问题是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)
);