2011-01-25 37 views

cevap

28

o zaman yerleşik statik ForEach yöntemi kullanabilirsiniz dizisi dikkatli davranmalıyız: Bir List<T> uğraşıyoruz o zaman ForEach örneği yerleşik yöntemi kullanabilirsiniz

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

:

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

yerleşik herhangi keyfi IEnumerable<T> dizisine karşı çalışacağız şey yok, ama sen lüzum düşünürseniz kendi uzantısı yöntemi rulo için yeterli kolay:

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

Bu şeylerin yerleşik olarak bulunmadığı bir garip. Sanırım Python modelini takip edersem, biri yeni bir numaralandırma oluşturmak için 'Seç'i kullanır mı? – Domi

3

foreach hattı astarları LINQ uzantısı yöntemleri ile elde edilebilir.

yerine: Örneğin:

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

sen olabilir:

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

Tabii, List<>::ForEach gibi bir şey kullanabilirsiniz:

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

temel fark ise ve operatör arasındaki ? "?" bir ifade üretir. Yani Eğer bunu yapamaz:

 

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

ancak bu: Eğer foreach ifadesi böyle bir şey için doğal boşluk haricinde dönebilirsiniz hiçbir NET tipi var olup arıyorsanız Yani

 

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

ama orada boşluk türde hiçbir değerleridir, bu yüzden eşit sadece yazabilirsiniz: bir Birim tipi yerine yalnızca bir değerle yazmaktır boşluğun kullanılan birçok fonksiyonel dilde

 

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

. .NET bu taklit ve kendi foreach ifadesini oluşturabilirsiniz: Orada pek Ancak böyle ifadeler için herhangi bir kullanım durumunun mevcut

 

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

.