2009-07-08 10 views
1

다음과 같은 코드가 있다고 가정 해 보겠습니다.Linq 여러 Froms 결과를 캐시합니까?

IEnumerable<Foo> A = meh(); 
IEnumerable<Foo> B = meh(); 

var x = 
    from a in A 
    from b in B 
    select new {a, b}; 

mehIEnumerable을 반환한다고 가정 해 봅시다. 반복 할 때 값 비싼 계산을 많이 수행합니다. 물론 계산 된 결과를

 IEnumerable<Foo> A = meh().ToList(); 

을 사용하여 수동으로 캐싱 할 수 있습니다. A 및 B 수동 캐싱이 필요한지 또는 위의 쿼리가 실행 중 A 및 B 자체의 결과를 캐시하는 경우 제 질문입니다. 따라서 각 줄은 한 번만 계산됩니다. 2 * n과 n * n 계산의 차이는 엄청날 수 있으며 MSDN에서이 동작에 대한 설명을 찾지 못했습니다. 그 이유는 묻습니다.

답변

4

LINQ to Objects를 의미한다고 가정 할 때, 확실히 캐싱을 수행하지 않습니다. IMO도 마찬가지입니다. 제가 의미하는 바를 본다면 쿼리 결과가 아닌 쿼리를 작성하는 것입니다. 다른 것들과 별개로 메모리에서 합리적으로 보유 할 수있는 것보다 큰 시퀀스를 반복 할 수 있습니다 (예 : 멀티 기가 바이트 로그 파일의 모든 행을 반복). 나는 LINQ가 그것을 캐시하려고 시도하는 것을 원하지 않을 것입니다!

빠른 액세스를 위해 쿼리를 평가하고 버퍼링하려면 ToList()을 호출하는 것이 가장 좋습니다.

B에 대한 이 A에있는에 종속 됨으로써 캐싱하지 않는 또 다른 이유입니다. 예를 들어 :

var query = from file in Directory.GetFiles("*.log") 
      from line in new LineReader(file) 
      ...; 

당신은 정말 LINQ는 첫번째 로그 파일을 읽는의 결과를 캐시 및 모든 로그 파일에 대해 동일한 결과를 사용하지 않습니다. 컴파일러가 두 번째 from 절이 첫 번째 변수의 범위 변수에 의존하지 않는다는 것을 알아 차리는 것이 가능할 수 있다고 가정합니다. 그러나 여전히 일부 부작용이나 기타 요인에 의존 할 수 있습니다.

+0

실제로 많은 의미가 있습니다. – mafu

+0

Goodo. 기본적으로 LINQ *는 일반적으로 "벙어리이지만 예측 가능"한 접근 방식을 취합니다. 이는 IMO의 좋은 점입니다. –

관련 문제