是否有像Apply这样的集合的内置扩展方法?

时间:2009-05-09 21:24:54

标签: c# .net

我正在寻找像Apply:

这样的内置扩展方法
collection.Apply (predicate)

将对集合中包含的所有项目应用方法。

我首先要求我不要写一些已存在的东西。

编辑:我没有使用foreach的原因是因为我想用LINQ来表达方法。

4 个答案:

答案 0 :(得分:3)

嗯,有List<T>.ForEach,但IEnumerable<T>没有。这是大量第三方“额外扩展方法”工具包中的那种东西:)

我同意其他答案,foreach通常是一种更好的方式 - 虽然它偶尔会产生差异:

DoSomething(x => x.Where(...).Select(...).ForEach(...));

DoSomething(x => {
    foreach (var y in x.Where(...).Select(...)) {
        (...)
    }
});

这比单行更重要。

我认为我通常只使用这样的方法,如果我已经有一个委托,或者可能是一个方法组。例如,能够使用单行转储过滤集合是非常好的:

people.Where(p => p.Age >= 18).ForEach(Console.WriteLine);

有可能在更多地接触到函数式编程后,我会更频繁地使用它。

答案 1 :(得分:1)

我很确定IEnumerable<T>ICollection<T>IList<T>没有。

但是,List<T>类有一个通用的ForEach方法(内置,不是扩展名),您可以这样使用:

list.ForEach(delegate);

就个人而言,我对这些方法没有任何实际价值。一个简单的foreach循环使用更多的单行并提供相同的可用性,但是当然没有什么能阻止你自己写一个。

答案 2 :(得分:1)

嗯,我不能没有基本的ForEach(...)扩展方法,也许是因为我吞下了功能性药丸或其他东西。

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
{
    if (sequence == null) throw new ArgumentNullException("sequence");
    if (action == null) throw new ArgumentNullException("action");

    foreach (T t in sequence)
        action(t);
}

有人可能会说这只会保存几行代码。 但我认为还有更多的东西:它保存了一个变量声明,我个人最喜欢的是它在intellisense中表现得非常好。

即。

people.Where(p => p.Age < 38)
      .Select(p => p.Firstname + " " + p.Surname)
      .ForEach(fullname => Console.WriteLine(fullname));

由于intellisense的强大功能,写入比foreach循环更容易,更快捷。

永远不要低估智能感知在API设计中的重要性。

答案 3 :(得分:0)

我不确定是否有类似的东西,但为什么不使用foreach,因为你正在对所有项目应用该方法。