2010-08-31 5 views
59

Quiero convertir una matriz o lista de enteros en una cadena separada por comas, como esto:string.join en una lista de <int> u otro tipo de

string myFunction(List<int> a) { 
    return string.Join(",", a); 
} 

Pero string.join sólo toma List<string> como el segundo parámetro . ¿Cuál es la mejor manera de hacer esto?

+2

¿Qué versión de C#/.NET está utilizando? –

+0

Estoy usando .NET 3.5 –

+0

Posible duplicado de http://stackoverflow.com/questions/3211422/linq-convert-a-listint-to-a-joined-string-of-ints – goodeye

Respuesta

108

La mejor manera es actualizar a .NET 4.0, donde hay una sobrecarga que hace lo que quiere:

Si no se puede actualizar, se puede lograr el mismo efecto usando Select y ToArray.

return string.Join(",", a.Select(x => x.ToString()).ToArray()); 
+0

También asume que es al menos en C# 3, .NET 3.5 –

+0

¡esa es una buena solución! – Stefanvds

+0

¿Por qué usar LINQ en lugar del método 'ToArray' incorporado de' List '? –

2

Esta respuesta es para ti si aún no quieres aventurarte en las profundidades de .NET 4.0.

String.Join() concatena todos los elementos de una matriz de cadenas, utilizando el separador especificado entre cada elemento.

La sintaxis es

public static string Join(
    string separator, 
    params string[] value 
) 

En lugar de pasar su lista de enteros al método join, sugiero la creación de una matriz de cadenas en primer lugar.

Aquí es lo que propongo:

static string myFunction(List<int> a) { 
    int[] intArray = a.ToArray(); 
    string[] stringArray = new string[intArray.Length]; 

    for (int i = 0; i < intArray.Length; i++) 
    { 
     stringArray[i] = intArray[i].ToString(); 
    } 

    return string.Join(",", stringArray); 
} 
+3

Este es un enfoque decente si alguien todavía está en 2.0. Sin embargo, 'intArray' es innecesario. 'List ' es indexable y tiene una propiedad 'Count', por lo que la conversión a una matriz es superflua. También es posible que desee convertir el carácter de unión en un parámetro en lugar de codificarlo en el método. –

2

tenía un método de extensión similar que he modificado a este

public static class MyExtensions 
{ 
    public static string Join(this List<int> a, string splitChar) 
    { 
     return string.Join(splitChar, a.Select(n => n.ToString()).ToArray()); 
    } 
} 

y utilizar de esta manera

var test = new List<int>() { 1, 2, 3, 4, 5 }; 
string s = test.Join(","); 

.NET 3.5

+0

No estoy seguro de que me gusta esto. 'IEnumerable ' ya tiene un método 'Join ', y este nuevo método realiza una operación completamente diferente, haciendo que su uso sea contradictorio. En segundo lugar, si * usted * va a crear este método, continúe y haga que sea genéricamente aplicable. –

+0

Es un truco que imita el método de combinación en matrices en Ruby. http://ruby-doc.org/core/classes/Array.html#M002182 –

+0

También .ToString() no siempre devuelve una representación de cadena de T, así que supongo que realmente podría causar cierta confusión. –

3

. NET 2.0:

static string IntListToDelimitedString(List<int> intList, char Delimiter) 
{ 
    StringBuilder builder = new StringBuilder(); 

    for (int i = 0; i < intList.Count; i++) 
    { 
     builder.Append(intList[i].ToString()); 

     if (i != intList.Count - 1) 
      builder.Append(Delimiter); 
    } 

    return builder.ToString(); 
} 
+2

Un buen enfoque 2.0. Es posible que desee convertir el carácter de unión en un parámetro en lugar de codificarlo en el método. –

+0

@Anthony - Buen punto. Hecho. –

+0

Una optimización típica es agregar el delimitador sin realizar pruebas, luego eliminar el último carácter una vez que salga del ciclo. –

5

Un escalable y segura implementación de una cadena numerable genérica se unen para .NET 3.5. El uso de iteradores es para que el valor de la cadena de unión no quede bloqueado al final de la cadena. Funciona correctamente con 0, 1 y más elementos:

public static class StringExtensions 
{ 
    public static string Join<T>(this string joinWith, IEnumerable<T> list) 
    { 
     if (list == null) 
      throw new ArgumentNullException("list"); 
     if (joinWith == null) 
      throw new ArgumentNullException("joinWith"); 

     var stringBuilder = new StringBuilder(); 
     var enumerator = list.GetEnumerator(); 

     if (!enumerator.MoveNext()) 
      return string.Empty; 

     while (true) 
     { 
      stringBuilder.Append(enumerator.Current); 
      if (!enumerator.MoveNext()) 
       break; 

      stringBuilder.Append(joinWith); 
     } 

     return stringBuilder.ToString(); 
    } 
} 

Uso:

var arrayOfInts = new[] { 1, 2, 3, 4 }; 
Console.WriteLine(",".Join(arrayOfInts)); 

var listOfInts = new List<int> { 1, 2, 3, 4 }; 
Console.WriteLine(",".Join(listOfInts)); 

disfrutar!

+0

+1: Esta es mi forma preferida de pre .NET 4.0. Mucho más escalable que producir una matriz completamente nueva de cadenas de una lista de ints para poder llamar a 'String.Join (String, String []) '. Lo único que diría es que es inusual ver este método escrito como una extensión en 'String' en comparación con' IEnumerable '- Tiendo a llamarlo siempre al final de una larga cadena de llamadas a métodos de extensión. –

+1

¡Robé la idea de Python si eso es de alguna ayuda! – Deleted

1

El uso de .NET 4,0

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     string s = myFunction(PopulateTestList()); 
     this.TextBox1.Text = s; 
    } 

    protected List<int> PopulateTestList() 
    { 
     List<int> thisList = new List<int>(); 
     thisList.Add(22); 
     thisList.Add(33); 
     thisList.Add(44); 

     return thisList; 
    } 

    protected string myFunction(List<int> a) 
    { 
     return string.Join(",", a); 
    } 
} 
1

En .NET lista de la clase tiene un método .ToArray().Algo como esto podría funcionar:

string myFunction(List<int> a) 
{ 
    return string.Join(",", a.ToArray()); 
} 

Ref: List<T> Methods (MSDN)

+0

Esta ['respuesta de 2010'] (http://stackoverflow.com/a/3610905/1733163) ya indica que, como' ToString' está implícito cuando se hace 'string.Join'. – Miller

Cuestiones relacionadas