Как получить методы расширения IEnumerable <T>для IEnumerable? - PullRequest
1 голос
/ 04 августа 2011

Я действительно люблю использовать методы расширения IEnumerable.

Но иногда я получаю некоторую коллекцию, которая реализует только IEnumerable, и поэтому они недоступны. Какой самый простой способ преобразовать коллекцию в форму, где я могу использовать эти методы?

И в целом, может ли кто-нибудь объяснить мне точно, в чем разница между этими двумя типами и историей, почему эти методы существуют для более нового IEnumerable?

Ответы [ 3 ]

11 голосов
/ 04 августа 2011

Как правило, используйте Cast() или OfType(). Оба преобразуют неуниверсальный IEnumerable в общий с указанным типом элемента - разница состоит в том, как они конвертируют каждый элемент. Cast будет разыгрывать каждый элемент, что означает, что он выдает исключение, если вы попросите его выполнить преобразование, которое он не может обработать. OfType просто пропускает элементы неправильного типа.

Подробнее см. В блоге Edulinq об этих операторах .

Что касается различия между этими двумя типами - неуниверсальный тип существовал до дженериков, в основном, и, следовательно, не безопасен для типов; Current свойство IEnumerator это просто object вместо определенного типа. (Кроме того, IEnumerator не реализует IDisposable, тогда как IEnumerator<T> делает.) Если вы новичок в дженериках, это больше, чем можно легко найти в ответе здесь ...

1 голос
/ 04 августа 2011

Чтобы перейти от IEnumerable к IEnumerable<T>, вы можете использовать либо Cast<T>(), либо OfType<T>.

.есть два.IEnumerable существовал с начальных .NET 1.0 дней.Хотя CLR внутренне поддерживает типизированные коллекции, они не были представлены в C # (или VB.NET).Поэтому, когда они были выставлены, пространство имен System.Collections.Generics было добавлено с IEnumerable<T>.

0 голосов
/ 04 августа 2011

Интерфейс IEnumerable уже существовал до того, как универсальные коллекции из пространства имен System.Collections.Generic, включая IEnumerable<T>, были добавлены в .NET Framework 2.0.

Вы можете привести свою неуниверсальную коллекцию куниверсальный с использованием метода расширения MakeGeneric():

public static class EnumerableExtensions
{
    public static IEnumerable<object> MakeGeneric(this IEnumerable nonGenericCollection)
    {
        return nonGeneric.Cast<object>();
    }
}
...