Когда использовать функции 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