2012-11-26 2 views
0

LINQ 접근 자/API를 비즈니스 클래스에 만드는 방법에 대한 좋은 자습서를 찾고 있습니다. 누군가가 결국 program--내 자신의 LINQ 컬렉션 만들기

var potentialCustomers = from people in county 
        where people.NumberOfCats > 2 
        select people 

이 뭔가를 입력 할 수 있도록 나는 닷넷 컬렉션에 자주 LINQ를 사용했지만, 내 자신의 클래스에 전에 그것을 한 적이 없다. 그것은 단지 IEnumerable 구현의 문제인가, 아니면 추가 단계가 필요합니까?

답변

1

클래스에 IEnumerable interface을 구현하기 만하면 LINQ를 사용할 수 있습니다.
LINQ는 IEnumerable 개체의 확장 집합이므로

+1

LINQ는 ** IE가 아닌 ** IEnumerable 개체에 대한 확장 집합입니다. 실제로 그것은 'IEnumerable '에 대한 확장 세트조차도 아닙니다. 당신은 그것을 앞뒤로 정의했습니다. IEnumerable 'LINQ 확장은 LINQ를 사용하는 데 필요한 메소드를 구현해야합니다. – Enigmativity

2

LINQ는 재미있는 짐승입니다.

즉시 LINQ를 논의 할 때 IEnumerable<T>이 마음에 듭니다. IEnumerable<T> LINQ 인 것처럼 보이지만 그렇지 않습니다. IEnumerable<T>IEnumerable<T>을 구현하는 개체에 대해 LINQ 쿼리를 작성할 수있는 LINQ 메서드의 구현 중 하나입니다.

또 다른 구현은 IObservable<T>이며 Microsoft의 Reactive Extensions를 지원합니다. LINQ 쿼리를 이벤트 (또는 데이터 스트림)에 대해 작성할 수있는 확장 집합입니다. IEnumerable<T>과 아무 관련이 없습니다.

LINQ는 또한 개체에 직접 쓸 수 있습니다. 확장 메서드 일 필요는 없습니다.

예를 들어,과 같이 클래스 AB을 정의

public class A 
{ 
    public B Select(Func<A, B> selector) 
    { 
     return selector(this); 
    } 
} 

public class B 
{ 
    public B(A a) { } 
} 

지금 나는이 코드를 작성할 수 있습니다 :

B query = 
    from x in a 
    select new B(x); 

그것의 LINQ, 짐,하지만 우리가 알고있는.

모든 LINQ 연산자는이 방법으로 정의 할 수 있습니다. 컴파일러가 올바른 시그니처가있는 메서드를 볼 수있게되면 당신은 황금색이됩니다.

이 LINQ 쿼리는 일련의 값으로 작업 할 때 자연 스럽다고 느꼈으므로 IEnumerable<T>IObservable<T>이 LINQ의 좋은 예입니다. 그러나 올바른 방법을 구현하여 원하는 유형에 대해 LINQ를 정의 할 수는 있습니다.