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>()
모든 품목이 string
s 인 경우 전화 해야합니다 .
그중 일부가 문자열이 아닌 경우 예외가 발생합니다.
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
.
