2009-09-25 1 views
20

두 접근법의 장점/단점은 무엇입니까?수익률 수익률 대 수익률 선택

foreach(var item in items) 
{ 
    yield return DoSomething(item); 
} 

편집

return items.Select(item => DoSomething(item)); 

그들은 MSIL은 당신이 더 많은 읽을 찾을 수있는 한, 거의 동등으로?

+11

두 번째 코드 조각은 Select의 * ​​구현 *입니다. (이것이 LINQ to Objects라고 가정합니다.) 그것은 모두 선택입니다. foreach 루프를 실행하고 각 항목에 대해 대리자를 실행하고 결과를 산출합니다. –

+0

예. 그러나 첫 번째와 두 번째를 입력 할 때 여전히 차이가 있습니다. 첫 번째 차이점 : LOC 수, 두 번째 차이점 : 가독성, 세 번째 차이점 : 수익률 수익률이 방법에 존재하는 경우 몇 가지 제한이 적용됩니다 (즉, 동일한 방법으로 수익률 반환 후 반환 선택을 할 수 없음). –

답변

17

yield return 기술을 사용하면 Select 호출이 대리자를 사용하여 매개 변수화 된 표준 열거 자 클래스를 사용하는 반면 C# 컴파일러는 "뒷쪽에서"열거 자 클래스를 생성합니다. 실제로 대리인을위한 Select 케이스의 추가 호출 프레임 외에도이 둘 사이에는 큰 차이가 없어야합니다.

DoSomething 주위에 람다를 래핑하는 것은 의미가 없습니다. 직접 대리인을 전달하십시오.

+1

이 경우 람다와 반대되는 대의원을 전달하는 것과는 어떤 차이가 있습니까? –

+9

돌아 가기 items.Select (DoSomething); –

+0

아, 그렇게 생각하지 않았습니다. –

3

선택하면 "items"컬렉션의 각 항목에 대해 하나의 개체 만 반환 할 수 있습니다. 추가로 .Where(x => DoIReallyWantThis(x))을 사용하면 원하지 않는 항목을 제거 할 수 있지만 항목 당 하나의 객체 만 반환 할 수 있습니다. 항목 당 둘 이상의 개체를 원할 경우 .SelectMany을 사용할 수 있지만 읽을 수없는 단일 긴 줄을 사용하면 쉽게 끝낼 수 있습니다.

"수익률 반환"은 복잡한 데이터 구조를 살펴보고 여기 저기의 정보를 선택하는 경우 코드를 읽기 쉽게 만들 수 있습니다. 필자가 보아 왔던 가장 좋은 예는 반환 된 객체가 될 수있는 약 12 ​​개의 분리 된 조건이 있었고 각각의 경우에 반환 된 객체가 다르게 구성되었다는 것입니다.

9

나는 현재 내가 원하는 것보다 더 많은 시간을 보내고있는 천천히 움직이는 기업 세계에서 수익률 수익률은 그다지 새로운 .NET 3.5 프레임 워크가 필요하지 않다는 큰 이점을 가지고 있습니다. 적어도 또 2 년.

+0

멋진 답. 그러나 .NET Framework 3.5는 곧 업데이트 될 예정입니다 (4.0). –

+10

".NET Framework 3.5가 곧 업데이트됩니다"- 내가 일하는 곳이 아닙니다 :( – Joe