【发布时间】:2016-04-25 23:39:05
【问题描述】:
我们使用 for 或 foreach 循环遍历集合并处理每个条目。
在所有这些新的 C# 集合的 lambda 函数中是否有任何替代方法?
传统的做法
foreach(var v in vs)
{
Console.write(v);
}
有什么类似的吗?
vs.foreach(v => console.write(v))
【问题讨论】:
标签: c#
我们使用 for 或 foreach 循环遍历集合并处理每个条目。
在所有这些新的 C# 集合的 lambda 函数中是否有任何替代方法?
传统的做法
foreach(var v in vs)
{
Console.write(v);
}
有什么类似的吗?
vs.foreach(v => console.write(v))
【问题讨论】:
标签: c#
List 有 ForEach 方法,而 IEnumerable 没有。
对此有很多问题/答案。我认为它没有在 IEnumerable 中实现的主要原因是,Linq on Enumerables “意味着”没有副作用,因为它是一种查询语言。
Eric Lippert 在他的博客上解释了他的想法。
http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
【讨论】:
foreach 实际上更好)。
是的。
IList中,有一个ForEach扩展方法:
List 有一个 ForEach 方法:
List<string> list = new List<string>() { "1", "2", "3", "4" };
list.ForEach(s => Console.WriteLine(s));
这就是你要找的吗?
【讨论】:
List<T> 中的方法,它不是扩展方法。将 ForEach 添加到 LINQ 是没有意义的,但是将它移到 IList<T> 是有意义的:转到 here 来支持它! :)
List(T).ForEach 正是这样做的。
【讨论】:
默认情况下,没有。
您可以定义自己的:
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { foreach(T val in source) action(val); }
【讨论】:
Eric 提出了一个令人信服的论点,除了 List
在这样做的过程中,我最终更进一步,编写了一个 Once
代码如下:
public static class EnumerableExtensions
{
public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action)
{
foreach (var item in collection)
{
action(item);
}
}
public static IEnumerable<T> Once<T>(this IEnumerable<T> collection,
Func<IEnumerable<T>, bool> predicate, Action<IEnumerable<T>> action)
{
if (predicate(collection))
action(collection);
return collection;
}
public static IEnumerable<T> ForEvery<T>(this IEnumerable<T> collection,
Func<T, bool> predicate, Action<T> action)
{
foreach (var item in collection)
{
if (predicate(item))
action(item);
}
return collection;
}
}
你可以在我的博文Extend IEnumerable with ForEach and Once Methods找到示例使用代码。
【讨论】:
您所写的内容是完全合法的(除了案例) - 假设 vs 的类型将 ForEach 定义为扩展方法,或者如果它是 List。
ForEach 是为List<T> 定义的:
对
List<T>的每个元素执行指定的操作。
【讨论】:
vs.ToList().ForEach(item => Console.WriteLine(item));
【讨论】:
.NET 3.5 的 Linq 没有 Foreach,尽管 LinqBridge 提供了一个。我习惯了使用 Linqbridge,我很自然地assumed 它是 .NET 3.5 Framework 的一部分
如果您认为它可以为您的程序带来清晰性,只需将其添加到您的扩展方法集合中
static class Helper
{
public static IEnumerable<t> ForEeach<t>
(this IEnumerable<t> source, Action<t> act)
{
foreach (T element in source) act(element);
return source;
}
}
【讨论】:
static void Main(string[] args)
{
int[] i = {1, 2, 3, 4, 5, 6, 7, 78, 8, 9};
var data = i.ToList();
data.ForEach(m => { Console.WriteLine(m); });
Console.ReadKey();
}
【讨论】: