2011-01-25 33 views

回答

28

如果你正在處理數組那麼你可以使用內置的靜態ForEach方法:

Array.ForEach(yourArray, x => Console.WriteLine(x)); 

如果你正在處理一個List<T>那麼你可以使用內置的ForEach實例方法:

yourList.ForEach(x => Console.WriteLine(x)); 

沒有什麼內置那將努力反對任意IEnumerable<T>序列的,但它很容易,如果你覺得你需要它推出自己的擴展方法:

yourSequence.ForEach(x => Console.WriteLine(x)); 

// ... 

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

     foreach (T item in source) 
     { 
      action(item); 
     } 
    } 
} 
+0

奇怪的是,他們沒有內置這種東西。我猜如果有人會遵循Python模式,可以使用`Select`來構建一個新的枚舉? – Domi 2016-10-29 13:21:39

3

foreach線襯墊可以與LINQ擴展方法來實現。比如:

代替:

var result = new List<string>(); 
foreach (var item in someCollection) 
{ 
    result.Add(item.Title); 
} 

,你可以:

var result = someCollection.Select(x => x.Title).ToList(); 
2

當然,你可以使用類似List<>::ForEach

List<String> s = new List<string>(); 
    s.Add("These"); 
    s.Add("Is"); 
    s.Add("Some"); 
    s.Add("Data"); 
    s.ForEach(_string => Console.WriteLine(_string)); 
0

的主要區別,如果與運營商之間?是,如果是「?」產生一個表達式。即你不能做到這一點:

 

var _ = (exp) ? then : else; // ok 
 

但不是這樣的:

 

var _ = if (exp) { then; } else { else; }; // error 
 

所以,如果你正在尋找類似的foreach表達有沒有.NET類型可除空白自然恢復,但有沒有void類型的值,所以你同樣可以這樣寫:

 

foreach (var item in collection) process(item); 
 

在許多功能性語言單位類型是用來代替虛空當中是一個只有一個值類型。您可以在.NET中模擬這種創造你自己的foreach表達:

 

    class Unit 
    { 
     public override bool Equals(object obj) 
     { 
      return true; 
     } 

     public override int GetHashCode() 
     { 
      return 0; 
     } 
    } 

    public static class EnumerableEx 
    { 
     public static Unit ForEach<TSource>(
      this IEnumerable<TSource> source, 
      Action<TSource> action) 
     { 
      foreach (var item in source) 
      { 
       action(item); 
      } 

      return new Unit(); 
     } 
    } 
 

但是幾乎沒有任何存在的用例這樣的表達式。

相關問題