Каково точное использование AsEnumerable? Изменит ли он неперечислимую коллекцию на перечислимую сбор. Пожалуйста, дайте мне простой пример.
С# - пример AsEnumerable
Ответ 1
Прочитав ответы, я догадываюсь, что вам по-прежнему не хватает практического примера.
Я использую это, чтобы позволить мне использовать linq на datatable
var mySelect = from table in myDataSet.Tables[0].AsEnumerable()
where table["myColumn"].ToString() == "Some text"
select table;
Ответ 2
В разделе "Замечания" документации MSDN:
Метод
AsEnumerable<TSource>
не действует кроме изменения времени компиляции тип источника от типа, который реализуетIEnumerable<T>
доIEnumerable<T>
.
AsEnumerable<TSource>
можно использовать для выбора между реализациями запросов, когда последовательность реализуетIEnumerable<T>
, но также имеет другой набор доступных публичных методов запросов. Для пример, учитывая общий классTable
который реализуетIEnumerable<T>
и имеет свои собственные методы, такие как какWhere
,Select
иSelectMany
, a вызовWhere
вызовет публикациюWhere
методаTable
. ATable
тип который представляет таблицу базы данных, может имеют методWhere
, который принимает предикатный аргумент как выражение дерево и преобразует дерево в SQL для удаленное выполнение. Если удаленное выполнение не желательно, например, потому что предикат вызывает локальный метод,AsEnumerable<TSource>
метод может быть использован для скрытия пользовательских методов и вместо этого доступны операторы запроса.
Ответ 3
Если вы посмотрите на отражатель:
public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerable<TSource> source)
{
return source;
}
В основном он ничего не делает, кроме того, что выпускаете что-то, что реализует IEnumerable.
Ответ 4
Никто не упомянул об этом по какой-то причине, но обратите внимание, что something.AsEnumerable()
эквивалентно (IEnumerable<TSomething>) something
. Разница в том, что приведение требует, чтобы тип элементов указывался явно, что, конечно, неудобно. Для меня это основная причина использовать AsEnumerable()
вместо трансляции.
Ответ 5
AsEnumerable() преобразует массив (или список или коллекцию) в IEnumerable <T> коллекции.
Подробнее см. http://msdn.microsoft.com/en-us/library/bb335435.aspx.
Из приведенной выше статьи:
The AsEnumerable<TSource>(IEnumerable<TSource>) method has no effect other than to change the compile-time type of source from a type that implements IEnumerable<T> to IEnumerable<T> itself.
Ответ 6
AsEnumerable
может использоваться только для перечислимых коллекций. Он просто изменяет тип коллекции на IEnumerable<T>
для более легкого доступа к расширениям IEnumerable.
Ответ 7
Нет, это не изменяет неперечислимую коллекцию на перечислимую. Что он возвращает вам обратно, как IEnumerable, так что вы можете использовать его в качестве перечислимого. Таким образом, вы можете использовать объект в сочетании с расширениями IEnumerable и считаться таковыми.
Ответ 8
Вот пример кода, который может иллюстрировать правильное объяснение LukeH.
IEnumerable<Order> orderQuery = dataContext.Orders
.Where(o => o.Customer.Name == "Bob")
.AsEnumerable()
.Where(o => MyFancyFilterMethod(o, MyFancyObject));
Первое где Queryable.Where
, которое переводится в sql и запускается в базе данных (o.Customer не загружается в память).
Второе место Enumerable.Where
, которое вызывает метод in-memory с экземпляром чего-то, что я не хочу отправлять в базу данных.
Без метода AsEnumerable
мне нужно написать его вот так:
IEnumerable<Order> orderQuery =
((IEnumerable<Order>)
(dataContext.Orders.Where(o => o.Customer.Name == "Bob")))
.Where(o => MyFancyFilterMethod(o, MyFancyObject));
или
IEnumerable<Order> orderQuery =
Enumerable.Where(
dataContext.Orders.Where(o => o.Customer.Name == "Bob"),
(o => MyFancyFilterMethod(o, MyFancyObject));
Ни один из них не течет хорошо.
Ответ 9
static void Main()
{
/*
"AsEnumerable" purpose is to cast an IQueryable<T> sequence to IEnumerable<T>,
forcing the remainder of the query to execute locally instead of on database as below example so it can hurt performance. (bind Enumerable operators instead of Queryable).
In below example we have cars table in SQL Server and are going to filter red cars and filter equipment with some regex:
*/
Regex wordCounter = new Regex(@"\w");
var query = dataContext.Cars.Where(car=> article.Color == "red" && wordCounter.Matches(car.Equipment).Count < 10);
/*
SQL Server doesn’t support regular expressions therefore the LINQ-to-db providers will throw an exception: query cannot be translated to SQL.
TO solve this firstly we can get all cars with red color using a LINQ to SQL query,
and secondly filtering locally for Equipment of less than 10 words:
*/
Regex wordCounter = new Regex(@"\w");
IEnumerable<Car> sqlQuery = dataContext.Cars
.Where(car => car.Color == "red");
IEnumerable<Car> localQuery = sqlQuery
.Where(car => wordCounter.Matches(car.Equipment).Count < 10);
/*
Because sqlQuery is of type IEnumerable<Car>, the second query binds to the local query operators,
therefore that part of the filtering is run on the client.
With AsEnumerable, we can do the same in a single query:
*/
Regex wordCounter = new Regex(@"\w");
var query = dataContext.Cars
.Where(car => car.Color == "red")
.AsEnumerable()
.Where(car => wordCounter.Matches(car.Equipment).Count < 10);
/*
An alternative to calling AsEnumerable is ToArray or ToList.
*/
}