[C#] Linq에서 Cast () 및 Oftype ()을 사용하는 경우

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

예 :

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

또는

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

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



답변

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


예를 들어 편집 :

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


답변

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;
}

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


답변

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

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


답변

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


답변

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


답변

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


답변

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