2008-11-25 49 views
14

可能重複:
LINQ equivalent of foreach for IEnumerable<T>現有的類似於Parallel.For的LINQ擴展方法?

爲IEnumerable的

LINQ的擴展方法是,如果你想要做的是應用一些計算每個項目中非常方便......但沒有多大用處枚舉不返回任何東西。所以我想知道如果也許我只是錯過了正確的方法,或者如果它真的不存在,我寧願使用內置版本,如果它可用...但我還沒有找到一個:-)

我可以發誓在那裏有一個.ForEach方法,但我還沒有找到它。在此期間,我沒有的情況下,寫我自己的版本,它是爲別人有用:

using System.Collections; 
using System.Collections.Generic; 

public delegate void Function<T>(T item); 
public delegate void Function(object item); 

public static class EnumerableExtensions 
{ 
    public static void For(this IEnumerable enumerable, Function func) 
    { 
     foreach (object item in enumerable) 
     { 
      func(item); 
     } 
    } 

    public static void For<T>(this IEnumerable<T> enumerable, Function<T> func) 
    { 
     foreach (T item in enumerable) 
     { 
      func(item); 
     } 
    } 
} 

用法是:

myEnumerable.For<MyClass>(delegate(MyClass item) { item.Count++; });

+5

CF埃裏克利珀的答案在這裏:http://blogs.msdn.com/ericlippert/archive/2009 /05/18/foreach-vs-foreach.aspx – Benjol 2009-05-19 05:59:58

回答

15

爲什麼要放一點點:

LINQ本質上是功能性的。它用於查詢數據並返回結果。 LINQ查詢不應該改變應用程序的狀態(有一些例外,如緩存)。因爲foreach不會返回任何結果,所以它沒有太多的用處,除了傳遞給它的東西外,不涉及改變某些東西的狀態。如果你需要一個Foreach()擴展方法,它容易推出自己的。

另一方面,如果您想要的是在每個返回結果的項目上進行輸入並調用函數,那麼LINQ將通過其select方法提供一種方法。

例如,下面的代碼調用列表中的每一項功能的委託,返回true,如果該項目是肯定的:

static void Main(string[] args) 
    { 
     IEnumerable<int> list = new List<int>() { -5, 3, -2, 1, 2, -7 }; 
     IEnumerable<bool> isPositiveList = list.Select<int, bool>(i => i > 0); 

     foreach (bool isPositive in isPositiveList) 
     { 
      Console.WriteLine(isPositive); 
     } 

     Console.ReadKey();   
    } 
+2

請參閱http://stackoverflow.com/questions/858978/lambda-expression-using-foreach-clause和http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach- vs-foreach.aspx – 2012-07-07 23:22:51

3

在foreach方法上List<T>做到這一點。你可以將你的集合包裝在一個列表中,然後使用這個調用,但這不是一件好事。看起來你必須推出自己的。

+0

nope,除非我失去了一些東西,沒有.ForEach方法 – 2008-11-25 16:19:57

+0

我調整了我的答案,因爲ForEach在List <>上。 – 2008-11-25 16:22:05

-1

已經討論過herethere

我還記得太睏倦了,但基本上,單線程應用程序中的.ForEach方法在功能上等同於已有的foreach語句。根據我的理解,主要區別在於ForEach可以被並行化,但這會導致不必要的行爲太容易。

9

其實,從微軟研究院的反應擴展框架確實添加了這個功能。 在System.Interactive組件中,它們包含Run()IEnumerable<T>Do()擴展。

Do(action)將對每個元素執行操作並將其返回。這是添加記錄到LINQ查詢例如有用:

var res = GetRandomNumbers(100).Take(10) 
     .Do(x => Console.WriteLine("Source -> {0}", x)) 
     .Where(x => x % 2 == 0) 
     .Do(x => Console.WriteLine("Where -> {0}", x)) 
     .OrderBy(x => x) 
     .Do(x => Console.WriteLine("OrderBy -> {0}", x)) 
     .Select(x => x + 1) 
     .Do(x => Console.WriteLine("Select -> {0}", x)); 

這將導致:

Source -> 96 
Where -> 96 
Source -> 25 
Source -> 8 
Where -> 8 
Source -> 79 
Source -> 25 
Source -> 3 
Source -> 36 
Where -> 36 
Source -> 51 
Source -> 53 
Source -> 81 
OrderBy -> 8 
Select -> 9 
9 
OrderBy -> 36 
Select -> 37 
37 
OrderBy -> 96 
Select -> 97 
97 

運行(動作)就像foreach循環,這意味着它的摺疊順序執行動作。

你可以閱讀更多關於它在這裏:http://community.bartdesmet.net/blogs/bart/archive/2009/12/26/more-linq-with-system-interactive-the-ultimate-imperative.aspx

在RX框架可以在這裏找到:http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx