c#lambda推理的问题

时间:2012-02-26 11:20:31

标签: c# lambda

我写了这样的代码:

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

我收到编译错误:

  

方法的类型参数   “System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,   System.Func)'无法从用法中推断出来。   尝试明确指定类型参数。

WriteLine可以接受字符串和对象作为参数,这可能是错误的来源,但我该如何重写呢?

4 个答案:

答案 0 :(得分:7)

Select方法需要Func<TSource, TResult>,但Console.WriteLine的返回类型为void,即根本没有值。因此,在这种情况下,TResult将是void,显然,Select的返回类型不能是IEnumerable<void>(即“一系列无关”......)

传递给Select 的lambda表达式返回一个值。如果您只想打印File.ReadAllLines的结果,请使用forforeach循环。

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