csv 到 xml 和 lambda 表达式

csv to xml and lambda expressions

我有以下代码将 csv 转换为 XML。

var xml = new XElement("root",
        lines.Where((line, index) => index > 0).Select(line => new XElement("TEST",
        line.Split(',').Select((column, index) => new XElement(headers[index], column)))))

我确实了解了这里的大局。正如我得到每一行的作用但我不明白为什么使用(行,索引)这样的部分。这是否意味着当索引>0 时,它会将行设置为相应的值?

如果有人能帮我分解一下,我将不胜感激。如果不使用 lambda 表达式会很棒。

首先,真正如果你缩进得更清楚会有所帮助:

var xml = new XElement("root",
    lines.Where((line, index) => index > 0) // Skips first line
         .Select(line => new XElement("TEST",
             line.Split(',')
                 .Select((column, index) => new XElement(headers[index], column)))))

在 Visual Studio 中,我可能会使用更多水平 space,将 line.Splitnew XElement("TEST").

放在同一行

现在,任何采用 lambda 的 WhereSelect 调用,例如 (value, index),每个项目都会收到两条信息:

  • 价值本身
  • 序列中的索引

所以.Where((line, index) => index > 0就是"ignore the first line"。写成.Skip(1).

会更清楚

接下来,.Select((column, index) => new XElement(headers[index], column)) 获取每一列,并创建一个元素,其中相应的 header 作为元素名称,column 作为值。就个人而言,我会使用 Zip 来写这个,留下:

var xml = new XElement("root",
    lines.Skip(1)
         .Select(line => new XElement("TEST",
             line.Split(',')
                 .Zip(headers, (value, header) => new XElement(header, value)))))