Development Tip

LINQ는 IEnumerable에서 작동합니까?

yourdevel 2020. 10. 7. 21:21
반응형

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함수 를 사용하여 typed로 변환해야합니다 IEnumerable<T>. 예를 들면

IEnumerable e = ...;
IEnumreable<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 # 언어 사양의 명시 적 범위 변수 유형 을 참조하십시오.

참고 URL : https://stackoverflow.com/questions/7757365/does-linq-work-with-ienumerable

반응형