[.net] LINQ는 IEnumerable에서 작동합니까?

구현하는 클래스가 IEnumerable있지만 구현하지 않습니다 IEnumerable<T>. 이 클래스를 변경할 수 없으며 대신 다른 클래스를 사용할 수 없습니다. MSDN에서 이해했듯이 LINQ는 클래스가IEnumerable<T> . 을 사용해 보았지만 instance.ToQueryable()여전히 LINQ 메서드를 활성화하지 않습니다. 이 클래스는 한 가지 유형의 인스턴스 만 포함 할 수 있으므로 클래스가를 구현할 수 IEnumerable<T>있지만 그렇지 않습니다. 그렇다면 LINQ 식을 사용하여이 클래스를 쿼리하려면 어떻게해야합니까?



답변

LINQ를 완전히 지원하는 IEnumerable의 제네릭 버전을 사용 Cast<T>()하거나 OfType<T>가져올 수 있습니다 .

예 :

IEnumerable objects = ...;
IEnumerable<string> strings = objects.Cast<string>();

또는 포함 된 유형을 모르는 경우 언제든지 다음을 수행 할 수 있습니다.

IEnumerable<object> e = objects.Cast<object>();

비 제네릭 IEnumerable이 다양한 유형의 객체를 포함하고 예를 들어 관심이 있다면. 할 수있는 문자열 :

IEnumerable<string> strings = objects.OfType<string>();


답변

예, 그럴 수 있습니다. Cast<T>함수 를 사용하여 형식화 된 IEnumerable<T>. 예를 들면 :

IEnumerable e = ...;
IEnumerable<object> e2 = e.Cast<object>();

이제 e2이며 IEnumerable<T>모든 LINQ 함수를 사용할 수 있습니다.


답변

LINQ의 쿼리 이해 구문을 사용할 수도 있습니다.이 구문 item은 형식이 지정된 경우 범위 변수의 형식 ( 이 예에서는)으로 캐스팅 됩니다.

IEnumerable list = new ArrayList { "dog", "cat" };

IEnumerable<string> result =
  from string item in list
  select item;

foreach (string s in result)
{
    // InvalidCastException at runtime if element is not a string

    Console.WriteLine(s);
}

효과는 @JaredPar의 솔루션과 동일합니다. 자세한 내용은 7.16.2.2 : C # 언어 사양의 명시 적 범위 변수 유형 을 참조하십시오.


답변