Когда использовать Cast () и Oftype () в Linq
Мне известны два метода приведения типов к IEnumerable из Arraylist в Linq и интересно, в каких случаях их использовать?
Например
IEnumerable<string> someCollection = arrayList.OfType<string>()
Или
IEnumerable<string> someCollection = arrayList.Cast<string>()
В чем разница между этими двумя методами и где я должен применять каждый случай?
7 ответов:
OfType- возвращает только те элементы, которые можно безопасно привести к типу x.Cast- попытаемся привести все элементы в тип x. если некоторые из них не из этого типа, то получимInvalidCastExceptionEDIT
например: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>(), Если вы знаете, что некоторые из элементов не являютсяstrings, и вы не хотите эти элементы.
Если некоторые из них не являются строками, их не будет в новомIEnumerable<string>.
Следует отметить, что Cast (Of T) может использоваться в IEnumerable в отличие от других функций LINQ, поэтому если когда-либо возникнет необходимость использовать LINQ в неродовой коллекции или списке, таком как ArrayList, вы можете использовать Cast(Of T) для приведения к IEnumerable(of T), где LINQ может работать.
Cast()попытается привести все элементы коллекции (и выдаст исключение, если элемент имеет неправильный тип), в то время какOfType()вернет только элементы правильного типа.
OfType будет фильтровать элементы, возвращая только элементы указанного типа. Приведение завершится сбоем, если элемент не может быть приведен к целевому типу.
Приведение попытается привести все элементы к заданному типу T. это приведение может завершиться ошибкой или вызвать исключение. OfType возвращает подмножество исходной коллекции и возвращает только объекты типа T.
Comments