我正在寻找像Apply:
这样的内置扩展方法collection.Apply (predicate)
将对集合中包含的所有项目应用方法。
我首先要求我不要写一些已存在的东西。
编辑:我没有使用foreach的原因是因为我想用LINQ来表达方法。答案 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,因为你正在对所有项目应用该方法。