2008-08-07 7 views
11

일부 C# 3 컬렉션 필터를 프로토 타이핑하고 있는데이 문제가 발생했습니다. 내가 LINQ가 예상대로 작동 필터링하는 데 사용하는 경우 이제컬렉션을 필터링하기 위해 LINQtoObjects를 통해 lambda와 함께 확장 메서드를 사용하는 경우?

public class MyProduct 
{ 
    public string Name { get; set; } 
    public Double Price { get; set; } 
    public string Description { get; set; } 
} 

var MyProducts = new List<MyProduct> 
{    
    new MyProduct 
    { 
     Name = "Surfboard", 
     Price = 144.99, 
     Description = "Most important thing you will ever own." 
    }, 
    new MyProduct 
    { 
     Name = "Leash", 
     Price = 29.28, 
     Description = "Keep important things close to you." 
    } 
    , 
    new MyProduct 
    { 
     Name = "Sun Screen", 
     Price = 15.88, 
     Description = "1000 SPF! Who Could ask for more?" 
    } 
}; 

: 나는 제품의 컬렉션이

var d = (from mp in MyProducts 
      where mp.Price < 50d 
      select mp); 

을 그리고 난 람다와 결합 된 경우 확장 방법을 사용하는 경우 필터는 작동 잘 :

var f = MyProducts.Where(mp => mp.Price < 50d).ToList(); 

질문 :는 무엇의 차이, 그리고 왜 다른 통해 하나를 사용?

답변

5

LINQ는 코드와 같은 메서드 호출로 바뀝니다.

즉, 차이가 없어야합니다.

그러나 코드의 두 부분에서 첫 번째 코드는 .ToList를 호출하지 않으므로 첫 번째 코드는 열거 가능한 데이터 소스를 생성하지만, .ToList를 호출하면 두 코드는 동일해야합니다 . f는 변환이 C# 컴파일러에 의해 수행된다 List<MyProduct>

동안 한 d는 IEnumerable<MyProduct>되는 바와 같이 ToList 차이 이외

0

는 # 2 많은 판독 및 IMO

4

자연

var d = 
    from mp in MyProducts 
    where mp.Price < 50d 
    select mp; 

var d = 
    MyProducts. 
    Where<MyProduct>(mp => mp.Price < 50d). 
    Select<MyProduct>(mp => mp); 
    //note that this last select is optimised out if it makes no change 
:

은 (IL로 확장 된 제네릭 컴파일하기 전에)로 변환된다

이 간단한 경우에는 약간의 차이가 있음에 유의하십시오. Linq가 정말로 가치있는 곳은 훨씬 복잡한 루프입니다.

예를 들어,이 문은 그룹화, 주문 및 몇 가지 let 문을 포함 할 수 있으며 해당하는 .Method().Method.Method()이 복잡해지면 Linq 형식으로 읽을 수 있습니다.

0

d에 사용하는 구문은 컴파일러에서 확장 메서드와 동일한 IL로 변환됩니다. "SQL과 같은"구문은 LINQ 표현식을 표현하는보다 자연스러운 방법이라고 생각합니다 (개인적으로는 확장 메소드를 선호하지만). 이미 지적했듯이 첫 번째 예제에서는 IEnumerable 결과를 반환하지만 두 번째 예제에서는 ToList()에 대한 호출로 인해 List 결과를 반환합니다. 두 번째 예제에서 ToList() 호출을 제거하면 Where는 IEnumerable 결과를 반환하는 것과 같은 결과를 반환합니다.