2009-08-26 6 views
10

¿Cuál es la forma más elegante para devolver una cadena de una lista bien, sí, sé que puedo hacer algo comoforma más elegante para devolver una cadena de la lista <int>

public string Convert(List<int> something) 
{ 
    var s = new StringBuilder(); 
    foreach(int i in something) 
     s.AppendFormat("{0} ", i); 

    return s.ToString(); 
} 

pero estoy seguro de que hay una manera de hacer esto con lambdas probé también para anexar a un StringBuilder, pero que no está haciendo cuál espera

+0

¿No Eisntein decir algo sobre la elegancia de una vez? No recuerdo lo que fue por mi vida! – Ash

+1

"Si quieres describir la verdad, deja elegancia al sastre". –

Respuesta

23

IMO, usted era mejor con su versión original; LINQ es genial, pero no es la respuesta a todos los problemas. En particular, el enfoque string.Join exige una matriz adicional (con poca ganancia), y el enfoque Aggregate usa lotes de cadenas intermedias.

Tal vez lo convierten en un método de extensión, sin embargo - y perder la Format cosas:

public static string Concatenate<T>(this IEnumerable<T> source, string delimiter) 
{ 
    var s= new StringBuilder(); 
    bool first = true; 
    foreach(T t in source) { 
     if(first) { 
     first = false; 
     } else { 
     s.Append(delimiter); 
     } 
     s.Append(t); 
    }  
    return s.ToString(); 
} 
+0

+1 no podría estar más de acuerdo. – Ash

+6

Es gracioso; si .NET proporcionaba una función integrada llamada, por ejemplo, ListToString, y alguien publicaba la respuesta, "Simplemente use ListToString", todos la llamarían elegante. Pero si alguien escribiera una función que hiciera exactamente lo mismo internamente, con solo ver el código la gente lo llamaría torpe. LINQ puede parecer bastante conciso, pero eso no significa que no haya muchas cosas bajo las sábanas. –

+2

@Dan - bien puesto. De hecho, gran parte de LINQ * trata * de ocultar la complejidad: la complejidad sigue ahí, por supuesto ;-p. –

17
String result = String.Join(" ", list.Select(item => item.ToString()).ToArray()); 

para abordar el problema null se podría añadir un Where(item => item != null), utilice el c operador adicional, o el operador coalescente nulo. Pero cada "corrección" agregada a la expresión lo hará menos legible y elegante.

+2

Esperemos que no haya 'null's en la lista ;-p –

+4

Disculpe, ¿cómo es esto elegante? El hecho de que sea nuevo y Linq'y no significa que sea automáticamente elegante. Por cierto, he disfrutado usando Linq, pero no para todo. – Ash

+1

Eso puede ser importante. Aggregate + stringbuilder probablemente sea mejor. – Dykam

10

Uso string.join:

string.Join(" ", something.Select(i => i.ToString()).ToArray()) 
+0

+1 - corto y dulce! –

+0

Oops :) Reparado - Gracias Daniel. –

0
string result = list.Aggregate("", (str, i) => str + " " + i).TrimStart(' '); 
+0

Necesita convertir 'i' a una cadena en el lambda. – Richard

+0

En realidad no lo hace; está implícito en C#. – Jason

0

Uso LINQ y se acumulan:

string res = list.Select(x => x.ToString()).Aggregate("", (a,b) => a + " " + b); 

y guarda una matriz intermedia (pero para una lista grande crea O (n) cadenas de basura) .

3

Sin embargo, otro método de extensión:

public static class Extensions { 
    public static string Join(this List<int> list) { 
     return string.Join(" ", list.Select(item => item.ToString()).ToArray()); 
    } 
} 

uso:

string s = new List<int> {1, 2, 3}.Join(); 
1

Aprovechando tanto StringBuilder como LINQ:

public static string SpaceOut(this IEnumerable<int> list) 
    { 
     if (list.Count()==)) return string.Empty; 

     var res = new StringBuilder(); 

     list.Take(list.Count() - 1).ToList().ForEach(i => res.Append(i.ToString() + " ")); 
     res.Append(list.Last().ToString()); 

     return res.ToString(); 
    } 
5

Uso string.Join:

List<int> data = ..; 
var result = string.Join(";", data); // (.NET 4.0 only) 
var result = string.Join(";", data.Select(x => x.ToString()).ToArray()); // (.NET 3.5) 
Cuestiones relacionadas