以下是代码:
File.ReadLines(sourceFilePath).Select(line => line.Split('\t')).ToArray();
我知道“Select”关键字之前的情况。有人可以打破“line => line.Split ...
中发生的事情我的理解是,我们逐行浏览文本文件,并通过制表符解析和分割输入文本行(因为我知道文本是制表符分隔的)。但是,“line => line ...”究竟发生了什么?
我在文本进入数组的代码行的末尾。但是当我调试并逐步执行代码并使用locals窗口时,包含已读取内容的Array的名称是什么?如何查看读入数组的内容?
答案 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 - 将其视为delegate或Function的类型。从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)将每个结果“投影”成其他形式
在这种情况下,开发人员想要分割制表符上的每一行(产生一个数组,这是投影)并检索包含每个结果的数组。