请使用line =>解释这部分C#代码中发生了什么。 line和.toArray

时间:2012-09-04 17:52:29

标签: c# winforms visual-studio-2010

以下是代码:

File.ReadLines(sourceFilePath).Select(line => line.Split('\t')).ToArray();

我知道“Select”关键字之前的情况。有人可以打破“line => line.Split ...

中发生的事情

我的理解是,我们逐行浏览文本文件,并通过制表符解析和分割输入文本行(因为我知道文本是制表符分隔的)。但是,“line => line ...”究竟发生了什么?

我在文本进入数组的代码行的末尾。但是当我调试并逐步执行代码并使用locals窗口时,包含已读取内容的Array的名称是什么?如何查看读入数组的内容?

4 个答案:

答案 0 :(得分:5)

这就是说,基本上,“对于文件中的每一行,将制表符上的行拆分为字符串数组,然后创建这些数组的数组(这样返回数组中的每个元素都是一个数组) “

Select函数采用Enumerable of something并将函数应用于每个项目,为每个输入值生成1个输出值。在其他编程语言中,这称为地图或投影。

=>表示编译为委托函数的lambda表达式。它接受一个名为“line”的参数,其类型由用法推断(因为ReadLines返回一个IEnumerable of Strings,line是String类型。)

lambda的正文具有隐含的返回类型,该类型是上次调用(对Split的调用)产生的值。因此,该行说“在每一行上运行这个lambda”。

最后,最后(lambda之外)对.ToArray的调用将IEnumerable<String[]>返回的Select转换为数组数组(String[][])。< / p>

答案 1 :(得分:3)

=>lambda expression - 将其视为delegateFunction的类型。从File.Readlines返回的每个项目都由Select操作 - Select通过lambda函数line => line.Split('\t')传递每一行,该函数只接受一个参数(名为{{1}然后返回在line参数上调用.Split('\t')的结果。

答案 2 :(得分:2)

Select运算符是LINQ扩展方法,用于将集合中的投影元素处理为不同的形式。最常见的用法是从该集合的元素中选择一个列到一个新集合中,但是可以在lambda表达式中处理更复杂的投影。

编译器会自动推断Select方法返回的数据类型,以便它依赖于传入的lambda的输出。在你的情况下,lambda的输出是一个字符串数组,所以最终它会返回IEnumerable<string[]>。当您在结束时致电ToArray()时,您会将IEnumerable<string[]>转换为具体的string[][]

答案 3 :(得分:1)

这是Linq。

Select方法是IEnumerable的扩展,它允许你使用lambda表达式(line =&gt; ... part)将每个结果“投影”成其他形式

在这种情况下,开发人员想要分割制表符上的每一行(产生一个数组,这是投影)并检索包含每个结果的数组。