LINQ C#csv到xml重置计数器
我正在尝试创建一个简明的LINQ查询,以拆分CSV文件,并从我收集的XSD文件的列数组转换为XML文件 一切都很好。除了我不能让计数器在每一行之后重置回零。它应该是0,1,2,3,4,然后是0,1,2,3,4,但是它应该是0,1,2,3,4,然后是5,6,7,8,9 我是LINQ的新手,希望这对有经验的人来说很简单,谢谢LINQ C#csv到xml重置计数器,c#,xml,linq,csv,C#,Xml,Linq,Csv,我正在尝试创建一个简明的LINQ查询,以拆分CSV文件,并从我收集的XSD文件的列数组转换为XML文件 一切都很好。除了我不能让计数器在每一行之后重置回零。它应该是0,1,2,3,4,然后是0,1,2,3,4,但是它应该是0,1,2,3,4,然后是5,6,7,8,9 我是LINQ的新手,希望这对有经验的人来说很简单,谢谢 string[] columns = {"COL1","COL2","COL3","COL4","COL5"}; int Counter = 0; XElement cust
string[] columns = {"COL1","COL2","COL3","COL4","COL5"};
int Counter = 0;
XElement cust = new XElement("Root",
from str in source.Skip(1)
let fields = str.Split(',')
select new XElement("Records",
from c in columns
select new XElement(c, fields[Counter++])
)
);
这不是做这件事的方法。在LINQselect
子句中使用副作用函数(如incrementor)是非常糟糕的做法,特别是因为并行化之类的事情。如果您使用foreach
手动执行此操作,我可能会建议使用mod:
fields[(Counter++) % fields.Length]
但即使这样也会有点奇怪
这是一种更容易接受的方法,它使用该方法通过索引匹配列名来查找列名
string[] columns = {"COL1","COL2","COL3","COL4","COL5"};
var rows = source.Skip(1)
.Select(c => columns.Zip(c.Split(','),
(column, value) => new
{
Column = column,
Value = value
});
var elements = rows.Select(c => new XElement("Records",
c.Select(x => new XElement(c.Column, c.Value))));
return new XElement("Root", elements);
尽管如此,重要的是要注意,这在当前是不可归纳的,当列包含带逗号的引号的值时,它将失败。您可能希望查看第三方库。我自己运气不错。说句公道话,我对这方面还不熟悉,但你的建议很贴切。