string.Join su una lista o altro tipo

Voglio trasformare una matrice o lista di interi in una stringa delimitata da virgole, in questo modo:

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

Ma string.Join accetta solo List come secondo parametro. Qual è il modo migliore per farlo?

Il modo migliore è aggiornare a .NET 4.0 dove c’è un sovraccarico che fa quello che vuoi:

  • String.Join(String, IEnumerable)

Se non è ansible eseguire l’aggiornamento, è ansible ottenere lo stesso effetto utilizzando Select e ToArray.

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

Un’implementazione scalabile e sicura di un join di stringhe enumerabili generico per .NET 3.5. L’uso degli iteratori è tale che il valore della stringa di join non è bloccato alla fine della stringa. Funziona correttamente con 0, 1 e più elementi:

 public static class StringExtensions { public static string Join(this string joinWith, IEnumerable 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 { 1, 2, 3, 4 }; Console.WriteLine(",".Join(listOfInts)); 

Godere!

.NET 2.0:

 static string IntListToDelimitedString(List 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(); } 

Questa risposta è per te se non vuoi ancora avventurarti nelle profondità di .NET 4.0.

String.Join () concatena tutti gli elementi di una matrice di stringhe, utilizzando il separatore specificato tra ciascun elemento.

La syntax è

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

Piuttosto che passare il tuo elenco di interi al metodo Join, ti suggerisco di creare prima una serie di stringhe.

Ecco cosa propongo:

 static string myFunction(List 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); } 

Aveva un metodo di estensione simile che ho modificato a questo

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

e lo usi in questo modo

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

.NET 3.5

Utilizzo di .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 PopulateTestList() { List thisList = new List(); thisList.Add(22); thisList.Add(33); thisList.Add(44); return thisList; } protected string myFunction(List a) { return string.Join(",", a); } } 

In .NET la class list ha un metodo .ToArray() . Qualcosa del genere potrebbe funzionare:

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

Rif: List Methods (MSDN)