2009-04-17 14 views

risposta

21

Supponendo che gli elementi ignorare ToString in modo appropriato:

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

(Non ci sarebbe alcun vantaggio nell'utilizzo di farmaci generici in questo ciclo - saremmo finiti chiamare Console.WriteLine(object) comunque, quindi sarebbe comunque box così come avviene nella parte foreach in questo caso.)

MODIFICA: le risposte utilizzando sono molto buone.

mio ciclo precedente è più flessibile nel caso in cui si dispone di una sequenza arbitraria (ad esempio come il risultato di un'espressione LINQ), ma se è sicuramente una List<T> direi che è una scelta migliore.

Un vantaggio di è che se si dispone di un tipo di lista concreta, verrà utilizzato il sovraccarico più appropriato. Per esempio:

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

Quando si scrive i numeri interi, questo utilizzerà Console.WriteLine(int), mentre quando scrive le stringhe userà Console.WriteLine(string). Se non è disponibile un sovraccarico specifico (o se si sta utilizzando solo un generico List<T> e il compilatore non sa cosa sia T) utilizzerà Console.WriteLine(object).

Si noti l'uso di Console.WriteLine come un metodo di gruppo, a proposito. Questo è più conciso rispetto all'utilizzo di un'espressione lambda e in realtà leggermente più efficiente (poiché il delegato sarà solo una chiamata a Console.WriteLine, anziché una chiamata a un metodo che a sua volta chiama solo Console.WriteLine).

+0

Come usare questo per tipi di oggetti complessi dicono Lista dove persona contiene solo le proprietà di stringa . – Koder101

+0

@ Koder101: Probabilmente vorrai sovrascrivere 'ToString' in' Person'. –

14

È inoltre possibile utilizzare foreach integrato di List, come ad esempio:

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

Questo codice viene eseguito anche in modo significativo più veloce!

Il codice di cui sopra rende anche in grado di manipolare Console.WriteLine, come ad esempio fare:

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

* Significativamente * più veloce? Mi sembra molto improbabile, dato che il collo di bottiglia sarà l'output della console piuttosto che il loop. –

+0

haha ​​Posso togliere quella parola. È solo perché List . ForEach è più veloce perché ha solo una chiamata di metodo per iterazione vs foreach standard che ha 2 call call call Calling – CasperT

+0

Sì - è certamente più efficiente, ma non significativamente. Vale sempre la pena di ricordare dove sono realmente i colli di bottiglia :) Puoi rendere la prima versione ancora più efficiente usando Console.Write come un gruppo di metodi, btw ... (Non puoi farlo con il secondo, dato che sei effettivamente manipolando il parametro.) –

36

si può effettivamente fare è piuttosto semplice, dal momento che la lista ha un metodo ForEach e dal momento che è possibile passare in Console.WriteLine come un gruppo di metodi. Il compilatore utilizzerà quindi una conversione implicita per convertire il gruppo metodo, in questo caso, un Action<int> e scegliere il metodo più specifico dal gruppo, in questo caso `Console.WriteLine (int):

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

    list.ForEach(Console.WriteLine); 

Opere anche con stringhe =)

Per essere assolutamente pedante (e non sto suggerendo una modifica alla risposta - solo commenti per motivi di interesse) "Console.WriteLine" è un gruppo di metodi. Il compilatore utilizza quindi una conversione implicita dal gruppo metodo ad Action, selezionando il metodo più specifico (Console.WriteLine (int) in questo caso).

+2

Per essere assolutamente pedante (e non sto suggerendo una modifica alla tua risposta - solo commenti per motivi di interesse) "Console.WriteLine" è un gruppo di metodi. Il compilatore utilizza quindi una conversione implicita dal gruppo metodo all'azione , selezionando il metodo più specifico (Console.WriteLine (int) in questo caso). –

+0

Sì, come ho detto, "se ho ottenuto il mio testo corretto": p Aggiornamento della risposta (fammi sapere se ho sbagliato di nuovo!) – Svish

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

Questo ha funzionato meglio per me in quanto posso preparare la mia stringa prima di inviarlo alla console , invece di inviare una riga alla console ogni volta – Mart10

12

Mentre le risposte con sono molto buone.

Ho trovato il metodo String.Join<T>(string separator, IEnumerable<T> values) più utile.

Esempio:

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" 

Osservazioni:

Se separatore è nullo, una stringa vuota (String.Empty) viene usato preferibilmente. Se qualsiasi membro dei valori è null, viene utilizzata una stringa vuota.

Join(String, IEnumerable<String>) è un metodo comodo che permette di concatenare ogni elemento in un IEnumerable (Of String) collezione senza prima convertire gli elementi per un array di stringhe. È particolarmente utile con le espressioni di query Language-Integrated Query (LINQ).

Questo dovrebbe funzionare bene per il problema, mentre per gli altri, con valori di array. Utilizzare altri sovraccarichi di questo stesso metodo, String.Join Method (String, Object[])

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

1

Ho trovato questo più facile da capire:

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