2

这是代码:

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

我知道在“选择”关键字之前发生了什么。有人可以分解“line => line.Split ...

我的理解是,我们将逐行浏览文本文件,并通过制表符解析和拆分一行输入文本(因为我知道文本是制表符分隔的)。但是,“line => line...”到底是怎么回事?

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

4

4 回答 4

5

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

Select函数采用 Enumerable 某物并将函数应用于每个项目,为每个输入值生成 1 个输出值。在其他编程语言中,这称为 Map 或 Projection。

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

lambda 的主体具有最后一次调用(对 的调用Split)产生的值的隐含返回类型。因此,该行表示“在每一行上运行此 lambda”。

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

于 2012-09-04T17:54:10.747 回答
3

=>是一个lambda 表达式- 将其视为一种委托函数。从返回的每个项目File.Readlines都由Select-操作,Select通过 lambda 函数传递每一行,该函数line => line.Split('\t')接受一个参数(名为line),然后返回调用参数的.Split('\t')结果line

于 2012-09-04T17:56:00.930 回答
2

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

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

于 2012-09-04T17:59:30.733 回答
1

这是林奇。

Select 方法是 IEnumerable 的扩展,它允许您使用 lambda 表达式将每个结果“投影”到其他形式(行 => ... 部分)

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

于 2012-09-04T17:57:51.033 回答