1

我必须导入一个 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 中获得正确的索引?

谢谢

4

2 回答 2

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 查询格式中是不可能的。

于 2013-07-25T12:36:33.193 回答
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.SelectWhere有适当的重载。

于 2013-07-25T12:37:26.477 回答