LINQ는 재미있는 짐승입니다.
즉시 LINQ를 논의 할 때 IEnumerable<T>
이 마음에 듭니다. IEnumerable<T>
이 LINQ 인 것처럼 보이지만 그렇지 않습니다. IEnumerable<T>
은 IEnumerable<T>
을 구현하는 개체에 대해 LINQ 쿼리를 작성할 수있는 LINQ 메서드의 구현 중 하나입니다.
또 다른 구현은 IObservable<T>
이며 Microsoft의 Reactive Extensions를 지원합니다. LINQ 쿼리를 이벤트 (또는 데이터 스트림)에 대해 작성할 수있는 확장 집합입니다. IEnumerable<T>
과 아무 관련이 없습니다.
LINQ는 또한 개체에 직접 쓸 수 있습니다. 확장 메서드 일 필요는 없습니다.
예를 들어,과 같이 클래스 A
및 B
을 정의
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를 정의 할 수는 있습니다.
LINQ는 ** IE가 아닌 ** IEnumerable 개체에 대한 확장 집합입니다. 실제로 그것은 'IEnumerable'에 대한 확장 세트조차도 아닙니다. 당신은 그것을 앞뒤로 정의했습니다. IEnumerable 'LINQ 확장은 LINQ를 사용하는 데 필요한 메소드를 구현해야합니다. –
Enigmativity