2011-11-10 3 views
2

내가 LINQ 쿼리 등이에 사용하기 위해 IEnumerable을 변수를 선언 foreach 성명서에 기재되어 있습니까? 나중에

+0

같은 외부 범위에 IEnumerable<Data>를 정의 할 수 있습니다. 그게 맞습니까? – CodesInChaos

+0

그게 문제 인 것 같습니다. 오 얼굴 손바닥! DOH! DOH! DOH! – Jon

답변

3

IEnumerable<Data> 쿼리 유형은 using 블록 외부에서 선언 할 수 있습니다. 그러나 코멘트에서 myObject이 처리 된 후에는 열거 할 수 없다는 것이 분명합니다. using 블록을 떠나기 전에 모든 요소를 ​​목록으로 가져 오지 않으려면 using 블록 내에서 열거를 수행하면됩니다. 데이터베이스에서 데이터를 가져 오려면 해당 데이터베이스에 대한 연결이 열려 있어야합니다.

using(myObject.......) 
{ 
    var query = csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) }); 
    //Do some stuff 

    //Now I want to use the result of the query 
    foreach (var item in query) 
    ... 
} 
+0

질문하기 전에 orginally 시도했지만 변수에 아무것도 없었습니다 – Jon

+0

나는 쿼리를 실행하기 위해 .ToList()를 수행해야한다고 생각합니다. –

+0

@ 존 : 변수에 아무 것도 없다고 할 때, 그것이 null이라는 것을 의미합니까, 아니면 단지 빈 IEnumerable입니까? – StriplingWarrior

2

변수를 using 블록 외부에 선언하십시오.

ToList() 또는 ToArray()을 호출하여 쿼리를 실행하십시오. 그것은 using 절에서 돌아온 후 쿼리를 실행할 수 있다면

List<Data> data=null; 
using(myObject.......) 
{ 
    data=csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) }).ToList(); 
} 

당신이 할 수 있습니다 : 그런 경우

IEnumerable<Data> data=null; 
using(myObject.......) 
{ 
    data=csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) }); 
} 

을하지만, 왜 당신은 첫번째 장소에있는 using 절에를 가하고 있습니다 ?

  • 사용 ToList() 즉시 쿼리를 실행하고 메모리에 모두로드 : 쿼리가 배치되지 myObject에 의존하는 경우

    당신은 두 가지 선택이있다.

  • myObject 나중에 처리하십시오.
+0

ToList()를 호출해도 foreach와 동일한 성능이 저하됩니까? 내가 묻는 이유는 IEnumerable 에 6 ~ 800 만 개의 항목이 있기 때문입니다. – Jon

+0

목록에 모든 항목이 메모리에로드됩니다. – CodesInChaos

+0

하지만 foreach 실 거예요? 나는 그 많은 것을 기억할 수 없다! – Jon

3

IEnumerable을 잘 활용해야합니다. 이 기능의 장점은 필요할 때까지 쿼리가 평가되지 않는다는 것입니다. ToList()을 실행하면 쿼리가 완전히 실행됩니다. 가능한 한 많이 IEnumerable을 사용하는 것이 좋습니다.

당신은 내가 myObject에 배치되면 쿼리가 더 이상 작동하지 않는 가정이

IEnumerable<Data> myDataList; 
using(myObject.......) 
{ 
    myDataList =csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) }); 
} 
// do your stuffs 
// and just use the IEnumerable<Data> in your foreach loop 
foreach(var item in myDataList) 
{ 
    // here item is typeof(Data) 
} 
관련 문제