2013-07-25 4 views
1

CSV 파일을 가져와야합니다. 선 순서가 데이터에 중요하기 때문에 가져 오기 (색인)의 일부로 선 순서가 필요합니다.라인 번호 (색인)가 포함 된 Linq 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

LINQ 쿼리 구문이어야합니까? 또는 메소드 구문이 될 수도 있습니까? – flindeberg

+0

어느 쪽이든 괜찮습니다. Tim은 이미 메소드 구문을 사용하여 답변했습니다. :) – SolarX

답변

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 적절한 과부하가 있습니다.

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 질의 형식으로 불가능하다.