【问题标题】:csv to xml and lambda expressionscsv 到 xml 和 lambda 表达式
【发布时间】:2015-02-06 17:22:03
【问题描述】:

我有以下代码可以将 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)))))

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

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

【问题讨论】:

    标签: c# xml csv lambda


    【解决方案1】:

    首先,如果您缩进更清楚,它真的会有所帮助:

    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 中,我可能会使用更多的水平空间,将 line.Splitnew XElement("TEST") 放在同一行。

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

    • 值本身
    • 序列内的索引

    所以.Where((line, index) => index > 0 只是意味着“忽略第一行”。写成.Skip(1)会更清楚。

    接下来,.Select((column, index) => new XElement(headers[index], column)) 获取每一列,并创建一个元素,其对应的标题作为元素名称,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)))))
    

    【讨论】:

    • 如果我在名为“DATA=NITSService”的列标题中有一列,它会引发错误:system.xml.xmlexception '=' 字符十六进制值 0x3a 不能包含在名称中。我该如何摆脱这个?
    • 我实际上从字符串中删除了 = 符号。但如果您知道另一种方法,请告诉我。
    • @user2697903:嗯,不,这只是无效的 XML……你根本不能拥有包含 = 的 XML 元素或属性名称。
    • 如果 Lines 是一个数组列表,代码会是什么样子?
    • @user2697903:你为什么会有ArrayList?你可以使用Cast,但实际上已经有 10 年了,因为使用非泛型集合是个好主意......
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多