답변:
OfType
-안전하게 x 유형으로 캐스트 할 수있는 요소 만 반환하십시오.
Cast
-모든 요소를 유형 x로 캐스트하려고 시도합니다. 그들 중 일부 가이 유형이 아닌 경우InvalidCastException
예를 들어 편집 :
object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }
Cast<T>
는 컬렉션에 유형 T
요소 만 포함되어 있는지 확인할 때 사용해야한다는 것을 올바르게 지적합니다 . 유형 확인 OfType<T>
으로 인해 속도가 느려집니다 is
. 컬렉션이 유형 IEnumerable<T>
이면 Cast<T>
전체 컬렉션을 캐스팅하고 IEnumerable<T>
열거하지 않습니다. OfType<T>
여전히 열거됩니다. 심판 : stackoverflow.com/questions/11430570/…
.Cast<string>()
열거 될 때 던지지 않는 경우에도와 동일 하지 않습니다.OfType<string>()
. 그 이유는 null
값 이 항상로 건너 뛰기 때문입니다 .OfType<TResult>()
. 예 : new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()
만 줄 것이다 3
; 와 유사한 표현식은로 .Cast<string>()
평가됩니다 4
.
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;
}
반환 된 열거에는 지정된 형식으로 안전하게 캐스팅 할 수있는 요소 만 포함됩니다.