2015-11-11 2 views
2

Как говорится в документации DataTable.AsEnumerable()Какова цель класса EnumerableRowCollection <TRow>?

возвращает IEnumerable < T> объект, где универсальный параметр T является DataRow. Этот объект может использоваться в выражении LINQ или методе.

Но тип возвращение AsEnumerable() не просто IEnumerable<DataRow> это также EnumerableRowCollection<DataRow>

Почему этот тип? Какую пользу он дает, скажем, DataTable.Rows.Cast<DataRow>(), которая предоставляет только IEnumerable<DataRow>?

+0

Я думаю, разница не виден/важно вне рамок, так как все '' private' или internal'. [Здесь] (http://referencesource.microsoft.com/#System.Data.DataSetExtensions/System/Data/EnumerableRowCollection.cs,58e9b1a0e95c8bad,references) вы можете увидеть подробности реализации. –

+0

Я не специалист по набору данных, потому что я обычно стараюсь избегать этого, но быстрый взгляд на источник, похоже, указывает на то, что он делает что-то особенное с сортировкой и фильтрацией набора данных, в то время как 'IEnumerable ' не будет. –

+0

Вы используете метод '' AsEnumerable' '(https://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable (v = vs.110) .aspx) из 'System.Data 'namespace, а не' System.Linq' – octavioccl

ответ

0

На странице для EnumerableRowCollection<TRow> есть несколько методов расширения, которые конкретно принимают и возвращают EnumerableRowCollection<TRow> из этого я предполагаю, что есть DataTable конкретные реализации этих методов, которые не могут быть использованы при простом использовании IEnumerable<DataRow>

I также нашел blog post, который гласит

для того, чтобы LinqDataView работать без использования IQueryable (которые мы не хотим делать из соображений производительности), мы должны держаться класса реализации. До тех пор, пока вы работаете с экземпляром EnumerableRowCollection вместо «чего-то», который реализует IEnumerable, мы можем захватить каждый оператор LINQ в сумку состояния, которая позволяет нам воссоздать эффекты запроса LINQ в DataView.

Я думал, что LINQ-To-Objects покрыли любое использование LINQ с помощью IEnumerables, и что-то еще означало использование IQueryables, но я думаю, что это не так. IQueryable<T> также реализует IEnumerable<T>, но она имеет много более IQueryable конкретных методов расширения, доступных, чем DataRowCollection<TRow>

Смежные вопросы