Я хочу превратить массив или список целых чисел в строку с разделителями-запятыми, например:
string myFunction(List<int> a) {
return string.Join(",", a);
}
Но string.Join принимает только List<string>
второй параметр. Как лучше всего это сделать?
Ответы:
Лучший способ - перейти на .NET 4.0, где есть перегрузка, которая делает то, что вы хотите:
String.Join<T>(String, IEnumerable<T>)
Если вы не можете обновить, вы можете добиться того же эффекта, используя Select и ToArray.
return string.Join(",", a.Select(x => x.ToString()).ToArray());
источник
ToArray
методаList<T>
?int
.Масштабируемый и безопасный реализация родовых перечислимых строк объединяются для .NET 3.5. Итераторы используются для того, чтобы значение строки соединения не застревало в конце строки. Он корректно работает с 0, 1 и более элементами:
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(); } }
Применение:
var arrayOfInts = new[] { 1, 2, 3, 4 }; Console.WriteLine(",".Join(arrayOfInts)); var listOfInts = new List<int> { 1, 2, 3, 4 }; Console.WriteLine(",".Join(listOfInts));
Наслаждайтесь!
источник
String.Join(String, String[])
можно было вызвать. Единственное, что я бы сказал, это то, что необычно видеть этот метод, написанный как расширение,String
в отличие отIEnumerable<String>
- я склонен всегда вызывать его в конце длинной цепочки вызовов методов расширения..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(); }
источник
У меня был аналогичный метод расширения, который я изменил на этот
public static class MyExtensions { public static string Join(this List<int> a, string splitChar) { return string.Join(splitChar, a.Select(n => n.ToString()).ToArray()); } }
и вы используете это так
var test = new List<int>() { 1, 2, 3, 4, 5 }; string s = test.Join(",");
.NET 3.5
источник
IEnumerable<T>
у него уже естьJoin
метод, и этот новый метод выполняет совершенно другую операцию, что делает его использование нелогичным. Во- вторых, если вы были намерены создать этот метод, идти вперед и сделать это в общем применимо.Этот ответ для вас, если вы пока не хотите углубляться в глубины .NET 4.0.
String.Join () объединяет все элементы массива строк, используя указанный разделитель между каждым элементом.
Синтаксис:
public static string Join( string separator, params string[] value )
Вместо того, чтобы передавать ваш список целых чисел методу Join, я предлагаю сначала создать массив строк.
Вот что я предлагаю:
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); }
источник
intArray
этом нет необходимости.List<int>
индексируется и имеетCount
свойство, делающее преобразование в массив излишним. Вы также можете сделать присоединяемый символ параметром, а не жестко кодировать его в методе.Использование .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); } }
источник
В .NET у класса списка есть
.ToArray()
метод. Что-то вроде этого могло сработать:string myFunction(List<int> a) { return string.Join(",", a.ToArray()); }
Ссылка: Список <T> методов (MSDN)
источник
answer from 2010
уже сказано, что, какToString
подразумевается при выполненииstring.Join
.