2011-01-25 11 views

Odpowiedz

28

Jeśli masz do czynienia z tablicą następnie można użyć wbudowanego w statycznej ForEach metody:

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

Jeśli masz do czynienia z List<T> następnie można użyć metody wbudowany ForEach instancji :

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

nic wbudowaną że będziemy pracować na dowolnym IEnumerable<T> sekwencji, ale jest to dość łatwe do toczyć własną metodę rozszerzenia, jeśli czujesz, że musisz go:

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

Dziwne, że nie mają wbudowanych tych rzeczy. Zgaduję, że jeśli ktoś podążyłby za wzorcem Pythona, użyłoby się 'Wybierz' do zbudowania nowego wyliczenia? – Domi

3

foreach line-wkładki można osiągnąć metodami rozszerzeń LINQ. Na przykład:

zamiast:

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

można:

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

Oczywiście, można użyć coś jak 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

Podstawowa różnica między wtedy i operator ? jest to, że jeśli jest instrukcja, gdy "?" wytwarza wyrażenie. To znaczy. nie można tego zrobić:

 

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

ale nie w ten sposób:

 

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

Więc jeśli szukasz czegoś podobnego wyrażenia foreach nie ma typ .NET może naturalnie powrócić wyjątkiem nieważne, ale nie istnieją żadne wartości typu void, więc można równie wystarczy napisać:

 

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

W wielu językach funkcyjnych typu urządzenie jest używane zamiast pustki, która jest wpisać tylko jedną wartość. Można emulować to w .NET i tworzyć własne wyrażenia 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(); 
     } 
    } 
 

Istnieje jednak ledwie istnieje żadnych przypadków użycia dla takich wyrażeń.

Powiązane problemy