2011-01-25 19 views

Respuesta

28

Si usted está tratando con una matriz, puede utilizar el built-in estática ForEach método:

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

Si usted está tratando con un List<T> a continuación, puede utilizar el método integrado ForEach instancia :

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

No hay nada incorporado que va a trabajar en contra de cualquier secuencia arbitraria IEnumerable<T>, pero es bastante fácil de rodar su propio método de extensión si siente que lo necesita:

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

Es extraño que no tengan estas cosas incorporadas. Supongo que si uno sigue el patrón de Python, uno usaría 'Seleccionar' para construir una nueva enumeración. – Domi

3

foreach Hoja de liners podrían lograrse con métodos de extensión LINQ. Por ejemplo:

en lugar de:

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

se podía:

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

Claro, usted puede usar algo como 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

La diferencia principal entre si y operador ? es eso si es una declaración mientras "?" produce una expresión. Es decir. no se puede hacer esto:

 

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

pero no esto:

 

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

Así que si usted está buscando algo así como la expresión foreach no hay ningún tipo .NET que, naturalmente, puede volver a excepción de vacío, sino no hay valores de tipo void, por lo que puede igualmente acaba de escribir:

 

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

En muchos lenguajes funcionales se utiliza un tipo de unidad en lugar de vacío que es del tipo con un único valor. Puede emular esto en .NET y crear su propia expresión 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(); 
     } 
    } 
 

Existe, sin embargo casi no existe ningún caso de uso de tales expresiones.

Cuestiones relacionadas