구현하는 클래스가 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 # 언어 사양의 명시 적 범위 변수 유형 을 참조하십시오.