Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ C#csv到xml重置计数器_C#_Xml_Linq_Csv - Fatal编程技术网

LINQ C#csv到xml重置计数器

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

我正在尝试创建一个简明的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 = 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++])
 )
);
这不是做这件事的方法。在LINQ
select
子句中使用副作用函数(如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);

尽管如此,重要的是要注意,这在当前是不可归纳的,当列包含带逗号的引号的值时,它将失败。您可能希望查看第三方库。我自己运气不错。

说句公道话,我对这方面还不熟悉,但你的建议很贴切。