2017-12-21 3 views
2

각 레코드에 대해 TransformCvlValue 콜렉션을 반복하려고합니다.ToList()를 호출하여 Linq 선택

fields?.Select(x => TransformCvlValue(x, cvl)).ToList(); 

.ToList()으로 전화하면 예상대로 작동합니다. .ToList()을 호출해야하는 이유는 무엇입니까?

다른 방법이 있습니까?

+2

. 선택 자체는 쿼리 정의입니다. 실행하기 전까지는 평가되지 않습니다. ToList()는 다른 메소드와 함께 실제로 실행되도록합니다. 간단한 foreach 루프로 실행되는 것을 볼 수도 있습니다. 자세한 내용은 Linq 및 지연된 실행을 검색하십시오. –

+0

어떻게 작동하리라고 기대합니까? 나머지 코드를 추가 할 수 있습니까? – Lee

+0

ToList()는 결과 집합을 반복 할 수 있도록 열거 자 (IEnumerable)를 초기화하고 반환합니다. select는 다른 linq 문에 내장 될 수 있으므로 기본값으로 열거 가능 목록을 반환하기 때문에 많은 결과를 얻지 못합니다. – tatmanblue

답변

3

IEnumerable<T>에서 Select()을 호출해도 작업이 즉시 실행되지는 않지만 지정된 변형/동작으로 새 IEnumerable<T>이 작성됩니다. 일반적으로 에서 반복하거나 .ToList()을 호출하여 IEnumerable<T>이 구체화 될 때만 LINQ 확장 메서드가 호출됩니다.

Select()은 주로 한 유형에서 다른 유형으로 요소를 투영하려고 할 때 주로 사용해야합니다. 요소에 투영을 적용하여 IEnumerable<T>의 모든 요소에 대해 메서드를 호출 할 때을 사용하지 않아야합니다.

아마 나를 위해 가장 읽을 수있는 간단한 방법은 단순히 필드를 반복하는 것입니다 : 이것은 당신이 할 수있는 코드를하려는 분명한하게하고 당신이나 당신의 동료가있을 때 이해하기 쉽게

if (fields != null) 
{ 
    foreach (var field in fields) 
    { 
     TransformCvlValue(field, cvl); 
    } 
} 

앞으로도 코드를 유지하십시오.

+0

하지만'TransformCvlValue'는 OP에 관심이 있다고 생각되는 값을 반환하나요? 예제에서이 값은 무시됩니다. – Evk

+0

감사합니다. GeorgDangl 나는 해결책을 찾아갔습니다. TransformCvlValue는 값을 반환했지만 실제로 void가 아닌 값으로 변경했습니다. – user3582849

+0

그래, 반환 값이 필요 없다는 질문을 해석했는데 그렇지 않으면 문제가 발생하지 않았습니다.) – GeorgDangl