code

Linq에서 캐스트() 및 Oftype()을 사용하는 경우

starcafe 2023. 5. 23. 22:03
반응형

Linq에서 캐스트() 및 Oftype()을 사용하는 경우

두 가지 유형의 주조 방법을 알고 있습니다.IEnumerable에서Arraylist린크에서 어떤 경우에 그것들을 사용해야 하는지 궁금해하고 있습니까?

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

또는

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

이 두 가지 방법의 차이점은 무엇이며 각각의 경우 어디에 적용해야 합니까?

OfTypex 유형에 안전하게 캐스팅할 수 있는 요소만 반환합니다.
Cast모든 요소를 유형 x에 캐스팅하려고 할 것입니다. 만약 그들 중 일부가 이 유형이 아니라면 당신은 얻을 것입니다.InvalidCastException

편집
예:

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

출처: LINQ 팁: 열거형.OfType - .NET 솔루션화

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

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

명시적 캐스트를 사용하면 성능이 우수하지만 결과적으로InvalidCastException캐스팅이 실패하면,이 아이디어에 대한 덜 효율적이지만 유용한 변형은 다음과 같습니다.OfType<T>():

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

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

전화해 보세요Cast<string>()만약 당신이 모든 품목이strings.
일부가 문자열이 아닌 경우에는 예외가 적용됩니다.

전화해 보세요OfType<string>()만약 당신이 일부 품목이 그렇지 않다는 것을 안다면.string그리고 당신은 그 물건들을 원하지 않습니다.
만약 그들 중 일부가 현이 아니라면, 그들은 새로운 것이 아닐 것입니다.IEnumerable<string>.

주의해야 할 것은Cast(Of T)에 사용할 수 있습니다.IEnumerable다른 LINQ 함수와 달리, 만약 당신이 비일반적인 컬렉션이나 목록에서 LINQ를 사용해야 하는 경우가 있다면, 예를 들어,ArrayList사용할 수 있습니다.Cast(Of T)에 던지다, 던지다, 던지다, 던지다, 던지다, 던지다,.IEnumerable(Of T)LINQ가 작동할 수 있는 곳입니다.

Cast()컬렉션의 모든 요소를 캐스팅하려고 시도합니다(그리고 요소가 잘못된 유형인 경우 예외를 던집니다).OfType()올바른 형식의 요소만 반환합니다.

OfType요소를 필터링하여 지정된 유형의 요소만 반환합니다. Cast요소를 대상 유형에 캐스팅할 수 없는 경우 충돌합니다.

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

언급URL : https://stackoverflow.com/questions/4015930/when-to-use-cast-and-oftype-in-linq

반응형