Когда использовать Cast () и Oftype () в Linq



Мне известны два метода приведения типов к IEnumerable из Arraylist в Linq и интересно, в каких случаях их использовать?



Например



IEnumerable<string> someCollection = arrayList.OfType<string>()


Или



IEnumerable<string> someCollection = arrayList.Cast<string>()


В чем разница между этими двумя методами и где я должен применять каждый случай?

715   7  

7 ответов:

OfType - возвращает только те элементы, которые можно безопасно привести к типу x.
Cast - попытаемся привести все элементы в тип x. если некоторые из них не из этого типа, то получим InvalidCastException

EDIT
например:

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>(), Если вы знаете, что некоторые из элементов не являются string s, и вы не хотите эти элементы.
Если некоторые из них не являются строками, их не будет в новом IEnumerable<string>.

Следует отметить, что Cast (Of T) может использоваться в IEnumerable в отличие от других функций LINQ, поэтому если когда-либо возникнет необходимость использовать LINQ в неродовой коллекции или списке, таком как ArrayList, вы можете использовать Cast(Of T) для приведения к IEnumerable(of T), где LINQ может работать.

Cast() попытается привести все элементы коллекции (и выдаст исключение, если элемент имеет неправильный тип), в то время как OfType() вернет только элементы правильного типа.

OfType будет фильтровать элементы, возвращая только элементы указанного типа. Приведение завершится сбоем, если элемент не может быть приведен к целевому типу.

Приведение попытается привести все элементы к заданному типу T. это приведение может завершиться ошибкой или вызвать исключение. OfType возвращает подмножество исходной коллекции и возвращает только объекты типа T.

Comments

    Ничего не найдено.