String.Join in list <int> or other type
I want to turn an array or int list into a comma delimited string, for example:
string myFunction(List<int> a) { return string.Join(",", a); } But string.Join only accepts List<string> as the second parameter. What is the best way to do this?
The best way is to upgrade to .NET 4.0, where there is an overload that does what you want:
If you cannot update, you can achieve the same effect using Select and ToArray.
return string.Join(",", a.Select(x => x.ToString()).ToArray()); A scalable and secure implementation of common enumerable string concatenation for .NET 3.5. The use of iterators is that the value of the join string does not get stuck at the end of the string. It works correctly with 0, 1 or more elements:
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(); } } Using:
var arrayOfInts = new[] { 1, 2, 3, 4 }; Console.WriteLine(",".Join(arrayOfInts)); var listOfInts = new List<int> { 1, 2, 3, 4 }; Console.WriteLine(",".Join(listOfInts)); Enjoy it!
.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(); } This answer is for you if you do not want to venture into the depths of .NET 4.0.
String.Join () concatenates all elements of a string array using the specified delimiter between each element.
Syntax
public static string Join( string separator, params string[] value ) Instead of passing your list of int objects to the Join method, I suggest creating an array of strings first.
Here is what I suggest:
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); } Had a similar extension method that I modified for this
public static class MyExtensions { public static string Join(this List<int> a, string splitChar) { return string.Join(splitChar, a.Select(n => n.ToString()).ToArray()); } } and you use it like this
var test = new List<int>() { 1, 2, 3, 4, 5 }; string s = test.Join(","); .NET 3.5
Using .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); } } In .NET, the list class has a .ToArray() method. Something like this might work:
string myFunction(List<int> a) { return string.Join(",", a.ToArray()); } Ref: List of <T> Methods (MSDN)