扩展方法为每个项目中的字段赋值?

时间:2009-03-28 02:07:23

标签: c# linq extension-methods iqueryable

我可以发誓已经为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 个答案:

答案 0 :(得分:5)

基类库中没有任何内容。然而,许多许多开发人员在他们自己的公共库中拥有它,我们也在MoreLINQ中拥有它。

这有点违背了LINQ的精神,因为它只是副作用 - 但它确实很有用,所以我认为实用主义在这里胜过教条。

有一点需要注意 - 在您的示例中使用查询表达式确实没有意义。 (它不是完全冗余,但是如果你没有公开这个值并不重要。)select在这里没有做任何有用的事情。你可以这样做:

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

即使你想做一个“where”或“select”,我通常也会使用点符号:

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

仅使用查询表达式,它们实际上使代码更简单:)

答案 1 :(得分:2)

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
{
    foreach (var item in sequence)
    {
        action(item);
    }
}

答案 2 :(得分:1)

List&lt;&gt;上有一个foreach。大致相当于以下几点:

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