2011-09-26 2 views
1

foreach 루프가 작동하지만 을 사용하는 대신 LINQ을 사용하려고하면 아무런 예외없이 오류가 발생하지 않습니다.foreach 대신 LINQ를 사용하려고하지만 작동하지 않습니다.

public static IEnumerable<PatternInfo> LoadPatterns() { 
     var directoryInfo = new DirectoryInfo(PatternFullPath); 
     var dirs = directoryInfo.EnumerateDirectories(); 
     var result = new List<PatternInfo>(); 
     foreach (var info in dirs) 
     { 
      result.Add(new PatternInfo 
          { 
           PatternName = info.Name, 
           TemplateFileNames = GetTemplateFiles(info.FullName) 
          }); 
     } 
     return result; 
    } 

을하지만이 아니다는 :

이 코드는 노력

public static IEnumerable<PatternInfo> LoadPatterns() { 
     var directoryInfo = new DirectoryInfo(PatternFullPath); 
     var dirs = directoryInfo.EnumerateDirectories(); 
     var patterns = dirs.Select(info => new PatternInfo { 
      PatternName = info.Name, 
      TemplateFileNames = GetTemplateFiles(info.FullName) 
     }); 
     return patterns; 
    } 

어떤 조언이 도움이 될 것입니다.

+2

아무 예외도 말하지 않고 오류가 없다면 실제로 무슨 일이 벌어지고 있습니까? 당신이 그것을 축소하면 0 항목과 함께 열거 형가 있습니까? – Tejs

+1

linq 쿼리는 필요할 때까지 실행되지 않고, PatternFullpath는 IEnumerable을 사용할 때까지 변경되었을 수 있습니다. patterns.ToList()를 실행하여 문제가 해결되는지 확인하십시오. –

답변

6

두 코드의 차이점은 List<PatternInfo> 인 첫 번째 코드 샘플에서 목록의 모든 항목이 이미 채워져 있다는 것입니다. 그러면이 목록을 IEnumerable<PatternInfo>으로 반환합니다.

두 번째 예제에는 IEnumerable<PatternInfo>이 있습니다.이 패턴은 열거 형을 처음 반복 할 때만 패턴을로드합니다.

당신은 두 번째 버전은 다음 추가 동등 (패턴의 열망로드) 할 경우 ToList() :

return patterns.ToList(); 
+0

실수 : P, LINQ가 게으른 걸 잊었습니다. 정말 고마워요. :디 – saber

2

그럼 누군가가 그들을 열거하기 시작할 때까지, enumerables 그래서, 게으른 :

foreach (var item in LoadPatterns()) 
{ 
    ... 
} 

두 번째 예제의 .Select 문은 새로운 IEnumerable<T>을 반환하지만이 열거 형을 소비하거나 루프하는 코드가있을 때까지 실제로 실행되는 코드는 없습니다.

1

LINQ는 지연된 실행입니다. 성명서를 반환 하겠지만, 당신이 돌아 오는 IEnumerable을 반복 할 때까지는 평가를받지 못합니다. LoadPatterns()을 호출하는 코드는 무엇입니까?

관련 문제