Когда использовать функции Cast() и Oftype() в Linq
Мне известно о двух методах литья типов IEnumerable
от Arraylist
в Linq и интересно, в каких случаях их использовать?
например
IEnumerable<string> someCollection = arrayList.OfType<string>()
или
IEnumerable<string> someCollection = arrayList.Cast<string>()
В чем разница между этими двумя методами и где я должен применять каждый случай?
Ответы
Ответ 1
OfType
- возвращает только те элементы, которые можно безопасно привести к типу x.
Cast
- попытается привести все элементы к типу x. если некоторые из них не из этого типа, вы получите InvalidCastException
РЕДАКТИРОВАТЬ
например:
object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }
Ответ 2
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;
}
Возвращаемое перечисление будет включать только элементы, которые могут быть смещены к указанному типу.
Ответ 3
Вы должны позвонить Cast<string>()
, если знаете, что все элементы string
s.
Если некоторые из них не являются строками, вы получите исключение.
Вы должны позвонить OfType<string>()
, если знаете, что некоторые элементы не являются string
, и вы не хотите, чтобы эти элементы.
Если некоторые из них не являются строками, они не будут в новом IEnumerable<string>
.
Ответ 4
Следует отметить, что Cast(Of T)
может использоваться в IEnumerable
отличие от других функций LINQ, поэтому, если когда-либо возникнет необходимость использовать LINQ для неуниверсальной коллекции или списка, такого как ArrayList
, вы можете использовать Cast(Of T)
чтобы привести к IEnumerable(Of T)
где LINQ может работать.
Ответ 5
Cast()
будет пытаться использовать все элементы коллекции (и будет генерировать исключение, если элемент имеет неправильный тип), в то время как OfType()
будет возвращать только элементы надлежащего типа.
Ответ 6
OfType
будет фильтровать элементы так, чтобы они возвращали только элементы указанного типа. Cast
будет вылетать, если элемент не может быть приведен к типу цели.
Ответ 7
Cast<T>
попытается привести все предметы к данному типу T
Это приведение может завершиться неудачей или вызвать исключение. OfType<T>
вернет подмножество исходной коллекции и вернет только объекты типа T