Метод расширения для присвоения значения полю в каждом элементе? - PullRequest
2 голосов
/ 28 марта 2009

Я мог бы поклясться, что для класса Queryable уже создан метод расширения, который я просто не могу найти, но, возможно, я думаю о чем-то другом.

Я ищу что-то вроде:

IQueryable<Entity> en = from e in IDB.Entities select e;
en.ForEach(foo => foo.Status = "Complete");

en.Foreach () будет существенно выполнять:

foreach(Entity foo in en){
   foo.Status = "Complete";
}

Это уже написано? Если нет, то возможно ли написать упомянутый метод расширения, предпочтительно с учетом любой таблицы LINQ и любого поля в этой таблице. С чего начать?

Ответы [ 3 ]

5 голосов
/ 28 марта 2009

В библиотеке базовых классов ничего нет. Однако многие, многие разработчики имеют это в своей общей библиотеке, и у нас это есть также в MoreLINQ .

Это как бы противоречит духу LINQ, поскольку все дело в побочных эффектах - но это действительно полезно, поэтому я думаю, что прагматизм превосходит догму.

Стоит отметить, что в вашем примере нет смысла использовать выражение запроса. (Это не полностью избыточно, но если вы не выставляете значение, это не имеет значения.) Выбор не делает здесь ничего полезного. Вы можете просто сделать:

IDB.Entities.ForEach(foo => foo.status = "Complete");

Даже если вы хотите сделать один «где» или «выбрать», я обычно использую точечную запись:

IDB.Entities.Where(foo => foo.Name == "fred")
            .ForEach(foo => foo.status = "Complete");

Используйте выражения запросов только там, где они на самом деле упрощают код:)

2 голосов
/ 28 марта 2009
public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
{
    foreach (var item in sequence)
    {
        action(item);
    }
}
1 голос
/ 28 марта 2009

В списке есть foreach <>. Примерно что-то вроде этого:

IQueryable<Entity> en = from e in IDB.Entities select e;
en.ToList().ForEach(foo => foo.status = "Complete");
...