我必须导入CSV文件。由于行顺序对数据很重要,我需要它作为导入(索引)的一部分。 我现在所做的(解决方法)如下:
string[] allLines = File.ReadAllLines(soureFilePath, Encoding.Default);
//Add Line-Index
for (int i = 0; i < allLines.Length; i++)
{
allLines[i] = i + ";" + allLines[i];
}
_sourceList = (from line in allLines.Skip(1)
let data = line.Split(new[] {';'}, StringSplitOptions.None)
select
new MappingSource
{
Index = Convert.ToInt32(data[0]),
TargetEntity = data[1].Trim(),
TargetFolder = data[2].Trim(),
TargetLevel = data[3].Replace(',', '.').Trim(),
FolderDefinition = data[4].Trim(),
Type = data[5].Trim(),
SourceFolder = data[6].Trim(),
SourceLevel = data[7].Replace(',', '.').Trim(),
BucketStructure = data[8].Trim()
}).ToList();
我觉得这不是很优雅。有没有办法在Linq-Statement中获得正确的索引?
感谢名单
答案 0 :(得分:1)
由于它是一个数组,这实际上是有效的。但是要改变底层实现(即我不推荐它)。
var i = 0;
_sourceList = (from line in allLines.Skip(1)
let data = line.Split(new[] {';'}, StringSplitOptions.None)
select
new MappingSource
{
Index = i++,
TargetEntity = data[0].Trim(),
TargetFolder = data[1].Trim(),
TargetLevel = data[2].Replace(',', '.').Trim(),
FolderDefinition = data[3].Trim(),
Type = data[4].Trim(),
SourceFolder = data[5].Trim(),
SourceLevel = data[6].Replace(',', '.').Trim(),
BucketStructure = data[7].Trim()
}).ToList();
另一种方法是使用第二个IEnumerable.Select(),它给出了元素和索引,但在LINQ查询格式中不可能。
答案 1 :(得分:1)
您只能使用方法语法“注入”索引:
_sourceList = allLines.Skip(1)
.Select((line, index) => new{ data = line.Split(new[] {';'}, StringSplitOptions.None), line, index})
.Select(x => new MappingSource{ Index = x.index, TargetEntity = x.data[0].Trim(), ...)
.ToList()
Enumerable.Select
和Where
有适当的重载。