2009-04-17 35 views

Respuesta

21

Suponiendo que los artículos anular ToString apropiada:

public void WriteToConsole(IEnumerable items) 
{ 
    foreach (object o in items) 
    { 
     Console.WriteLine(o); 
    } 
} 

(No habría ninguna ventaja en el uso de los genéricos en este bucle - acabaríamos llamando Console.WriteLine(object) todos modos, por lo que sigue siendo la caja tal como lo hace en la parte foreach en este caso.)

EDITAR: Las respuestas usando son muy buenas.

Mi bucle de arriba es más flexible en el caso de que usted tiene una secuencia arbitraria (por ejemplo, como el resultado de una expresión LINQ), pero si definitivamente tiene un List<T> diría que es una mejor opción.

Una ventaja de es que si tiene un tipo de lista concreta, usará la sobrecarga más adecuada. Por ejemplo:

List<int> integers = new List<int> { 1, 2, 3 }; 
List<string> strings = new List<string> { "a", "b", "c" }; 

integers.ForEach(Console.WriteLine); 
strings.ForEach(Console.WriteLine); 

Al escribir los números enteros, para ello se utiliza Console.WriteLine(int), mientras que al escribir las cuerdas se usará Console.WriteLine(string). Si no hay sobrecarga específica disponible (o si solo está utilizando un genérico List<T> y el compilador no sabe qué es T) utilizará Console.WriteLine(object).

Tenga en cuenta el uso de Console.WriteLine como grupo de métodos, por cierto. Esto es más conciso que el uso de una expresión lambda, y de hecho ligeramente más eficiente (como el delegado simplemente ser una llamada a Console.WriteLine, en lugar de una llamada a un método que a su vez sólo llama Console.WriteLine).

+0

Cómo utilizar esto para los tipos de objetos complejos dicen Lista donde la persona sólo contiene propiedades de cadena . – Koder101

+0

@ Koder101: Probablemente quieras anular 'ToString' en' Persona'. –

14

También puede usar foreach incorporado de la Lista, tales como:

List<T>.ForEach(item => Console.Write(item)); 

Este código también se ejecuta significativamente más rápido!

El código anterior también le hace capaz de manipular Console.WriteLine, tales como hacer:

List<T>.ForEach(item => Console.Write(item + ",")); //Put a,b etc. 
+0

* Significativamente * ¿Más rápido? Eso me parece muy poco probable, ya que el cuello de botella será la salida de la consola en lugar de un bucle. –

+0

jaja Puedo decir esa palabra. Es solo porque List .ForEach es más rápido porque solo tiene una llamada a método por iteración frente a foreach estándar que tiene 2 llamadas a la instrucción callvirt IL – CasperT

+0

Sí, ciertamente es más eficiente, solo que no significativamente. Siempre vale la pena tener en cuenta dónde están realmente los cuellos de botella :) Puedes hacer que la primera versión sea aún más eficiente usando Console.Write como un grupo de métodos, por cierto ... (No puedes hacer eso con el segundo, ya que estás en realidad manipulando el parámetro.) –

36

En realidad, usted puede hacerlo bastante simple, ya que la lista tiene un método ForEach y ya que se puede pasar en Console.WriteLine como un grupo de métodos. El compilador utilizará entonces una conversión implícita para convertir el grupo método a, en este caso, un Action<int> y escoger el método más específica del grupo, en este caso `Console.WriteLine (int):

var list = new List<int>(Enumerable.Range(0, 50)); 

    list.ForEach(Console.WriteLine); 

Obras con cadenas también =)

Para ser completamente pedante (y no estoy sugiriendo un cambio en su respuesta, solo comentando por el bien de interés) "Console.WriteLine" es un grupo de métodos. El compilador usa entonces una conversión implícita del grupo de métodos a Acción, seleccionando el método más específico (Console.WriteLine (int) en este caso).

+2

Para ser totalmente pedante (y no estoy sugiriendo un cambio en tu respuesta, solo comentando por el interés) "Console.WriteLine" es un grupo de métodos. El compilador utiliza entonces una conversión implícita del grupo de métodos a la Acción , seleccionando el método más específico (Console.WriteLine (int) en este caso). –

+0

Sí, como dije, "si tengo mi redacción correcta": p Actualizando la respuesta (¡hágamelo saber si me equivoqué de nuevo!) – Svish

6
Console.WriteLine(string.Join<TYPE>("\n", someObjectList)); 
+1

Esto funcionó mejor para mí, ya que puedo preparar mi cadena antes de enviarla a la consola , en lugar de enviar una línea a la consola cada vez – Mart10

12

Mientras que las respuestas con son muy buenas.

Encontré String.Join<T>(string separator, IEnumerable<T> values) método más útil.

Ejemplo:

List<string> numbersStrLst = new List<string> 
      { "One", "Two", "Three","Four","Five"}; 

Console.WriteLine(String.Join(", ", numbersStrLst));//Output:"One, Two, Three, Four, Five" 

int[] numbersIntAry = new int[] {1, 2, 3, 4, 5}; 
Console.WriteLine(String.Join("; ", numbersIntAry));//Output:"1; 2; 3; 4; 5" 

Observaciones:

Si separador es nula, una cadena vacía (String.Empty) se utiliza en su lugar. Si algún miembro de los valores es nulo, se utiliza una cadena vacía en su lugar.

Join(String, IEnumerable<String>) es un método de conveniencia que le permite concatenar cada elemento en un IEnumerable (Of String) colección sin necesidad de convertir primero los elementos de una matriz de cadenas. Es particularmente útil con expresiones de consulta Language-Integrated Query (LINQ).

Esto debería funcionar bien para el problema, mientras que para otros, tener valores de matriz. Utilizar otras sobrecargas de este mismo método, String.Join Method (String, Object[])

Referencia: https://msdn.microsoft.com/en-us/library/dd783876(v=vs.110).aspx

1

encontré esto más fácil de entender:

List<string> names = new List<string> { "One", "Two", "Three", "Four", "Five" }; 
     for (int i = 0; i < names.Count; i++) 
     { 
      Console.WriteLine(names[i]); 
     } 
Cuestiones relacionadas