Foreach / For循环替代lambda函数?

时间:2010-04-23 14:22:25

标签: c#

我们使用或foreach循环收集并处理每个条目。

C#中的集合的所有新lambda函数是否还有其他选择?

传统的做事方式

foreach(var v in vs)
{
  Console.write(v);
}

有什么相似的吗?

vs.foreach(v => console.write(v))

9 个答案:

答案 0 :(得分:15)

List有ForEach方法,但IEnumerable没有。

关于此,有很多问题/答案。我认为它在IEnumerable中没有实现的主要原因是,Linq on Enumerables“意味着”是副作用,因为它是一种查询语言。

Eric Lippert在他的博客上解释了他的想法。

http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

答案 1 :(得分:8)

IList中有一个ForEach扩展方法:

列表有一个ForEach方法:

List<string> list = new List<string>() { "1", "2", "3", "4" };

list.ForEach(s => Console.WriteLine(s));

这就是你要找的东西吗?

答案 2 :(得分:3)

List(T).ForEach正是如此。

答案 3 :(得分:2)

默认情况下,没有一个 您可以定义自己的:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) {  
   foreach(T val in source)  
      action(val);  
}

答案 4 :(得分:2)

除了存在ForEach for List&lt; T&gt;之外,Eric提出了令人信服的论据。但仅适用于List&lt; T&gt;。我已经使用了非常有用的扩展方法,并且由于缺少IEnumerable&lt; T&gt;的一般扩展方法而同样感到沮丧,所以我最终决定编写自己的扩展方法。

在这样做的过程中,我最后又向前迈进了一步,写了一次&lt; T&gt;和ForEvery&lt; T&gt;流畅的扩展方法,允许对每个项目进行操作,并且只在该链中执行一次操作,如果没有其他原因,那么它们在当时似乎是个好主意。

以下是代码:

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上找到示例用法代码。

答案 5 :(得分:1)

你所写的内容完全合法(除了案例) - 假设vs的类型ForEach被定义为扩展方法,或者它是List。< / p>

ForEach定义为List<T>

  

List<T>的每个元素执行指定的操作。

答案 6 :(得分:0)

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();
}

答案 7 :(得分:0)

vs.ToList().ForEach(item => Console.WriteLine(item));

答案 8 :(得分:0)

.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;
    }
}