Linq에서 Cast () 및 Oftype ()을 사용하는 경우


211

Linq IEnumerable에서 유형을 캐스팅하는 두 가지 방법을 알고 Arraylist있으며 어떤 경우에 사용해야하는지 궁금합니다.

예 :

IEnumerable<string> someCollection = arrayList.OfType<string>()

또는

IEnumerable<string> someCollection = arrayList.Cast<string>()

이 두 방법의 차이점은 무엇이며 각 사례를 어디에 적용해야합니까?

답변:


322

OfType-안전하게 x 유형으로 캐스트 할 수있는 요소 만 반환하십시오.
Cast-모든 요소를 ​​유형 x로 캐스트하려고 시도합니다. 그들 중 일부 가이 유형이 아닌 경우InvalidCastException


예를 들어 편집 :

object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }

1
그것을 위해 건배. 둘 다 미리 시도했지만 둘 다 예상되는 모든 유형의 요소가 있었으므로 왜 차이점을 볼 수 없었습니까?

6
@SLaks Cast<T>는 컬렉션에 유형 T요소 만 포함되어 있는지 확인할 때 사용해야한다는 것을 올바르게 지적합니다 . 유형 확인 OfType<T>으로 인해 속도가 느려집니다 is. 컬렉션이 유형 IEnumerable<T>이면 Cast<T>전체 컬렉션을 캐스팅하고 IEnumerable<T>열거하지 않습니다. OfType<T>여전히 열거됩니다. 심판 : stackoverflow.com/questions/11430570/…
iPPy

23
.Cast<string>()열거 될 때 던지지 않는 경우에도와 동일 하지 않습니다.OfType<string>() . 그 이유는 null 이 항상로 건너 뛰기 때문입니다 .OfType<TResult>(). 예 : new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()만 줄 것이다 3; 와 유사한 표현식은로 .Cast<string>()평가됩니다 4.
Jeppe Stig Nielsen

1
다시 말해, 'as'와 'cast'연산자의 차이점과 같은 것입니다.
faza

111

http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/

기본적으로 Cast ()는 다음과 같이 구현됩니다.

public IEnumerable<T> Cast<T>(this IEnumerable source)
{
  foreach(object o in source)
    yield return (T) o;
}

명시 적 캐스트를 사용하면 성능이 좋지만 캐스트에 실패하면 InvalidCastException이 발생합니다. 이 아이디어에서 덜 효율적이지만 유용한 변형은 OfType ()입니다.

public IEnumerable<T> OfType<T>(this IEnumerable source)
{
  foreach(object o in source)
    if(o is T)
      yield return (T) o;
}

반환 된 열거에는 지정된 형식으로 안전하게 캐스팅 할 수있는 요소 만 포함됩니다.


38

Cast<string>()모든 품목이 strings 인 경우 전화 해야합니다 .
그중 일부가 문자열이 아닌 경우 예외가 발생합니다.

OfType<string>()일부 품목이 아닌 품목을 원하지 않는 경우 전화해야 string합니다.
그중 일부가 문자열이 아닌 경우 new에 포함되지 않습니다 IEnumerable<string>.


1
이 답변은 (현재) 유일하게 어떤 방법을 사용할 지에 대한 명확한 조언을 제공합니다.
CodeFox

4

다른 LINQ 함수와 달리 Cast(Of T)사용할 수 있다는 점에 유의해야합니다 IEnumerable. 따라서 일반 이외의 컬렉션이나 목록과 같은 목록 에서 LINQ 를 ArrayList사용해야 Cast(Of T)하는 IEnumerable(Of T)경우 LINQ가 작동 할 수 있는 곳 으로 캐스트하는 데 사용할 수 있습니다.


2

Cast()컬렉션의 모든 요소를 ​​캐스팅하려고 시도하고 요소의 유형이 잘못된 경우 예외가 발생하지만 OfType()적절한 유형의 요소 만 반환합니다.


2

OfType지정된 유형의 항목 만 반환하도록 요소를 필터링합니다. Cast요소를 대상 유형으로 캐스트 할 수 없으면 충돌이 발생합니다.


2

Cast<T>모든 항목을 지정된 유형으로 캐스팅하려고 시도합니다 T. 이 캐스트는 실패하거나 예외를 던질 수 있습니다. OfType<T>원본 컬렉션의 하위 집합을 반환하고 유형의 개체 만 반환합니다 T.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.