Самый элегантный способ вернуть строку из списка <int>
Каков самый элегантный способ вернуть строку из списка
хорошо, да, я знаю, я могу сделать что-то вроде
public string Convert(List<int> something)
{
var s = new StringBuilder();
foreach(int i in something)
s.AppendFormat("{0} ", i);
return s.ToString();
}
но я уверен, что есть способ сделать это с lambdas
Я также попытался добавить в построитель строк, но это не делает ожидаемые
Ответы
Ответ 1
ИМО, вам было лучше с вашей оригинальной версией; LINQ отлично, но это не ответ на все проблемы. В частности, подход string.Join
требует дополнительного массива (для небольшого коэффициента усиления), а в подходе Aggregate
используются лоты промежуточных строк.
Возможно, сделайте это методом расширения, но - и потеряйте материал Format
:
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();
}
Ответ 2
String result = String.Join(" ", list.Select(item => item.ToString()).ToArray());
Если это просто коллекция типа List<int>
(а не List<int?>
), то может быть только 0 вместо NULL.
Но для решения гипотетической или более общей проблемы null
можно добавить Where(item => item != null)
, использовать условный оператор или оператор нулевого слияния. Но каждое "исправление", добавленное к выражению, сделает его менее читабельным и элегантным.
Ответ 3
Используйте string.Join:
string.Join(" ", something.Select(i => i.ToString()).ToArray())
Ответ 4
Используйте 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)
Ответ 5
Еще один метод расширения:
public static class Extensions {
public static string Join(this List<int> list) {
return string.Join(" ", list.Select(item => item.ToString()).ToArray());
}
}
использование:
string s = new List<int> {1, 2, 3}.Join();
Ответ 6
Воспользовавшись как StringBuilder, так и 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();
}
Ответ 7
string result = list.Aggregate("", (str, i) => str + " " + i).TrimStart(' ');
Ответ 8
Используйте LINQ и накапливайте:
string res = list.Select(x => x.ToString()).Aggregate("", (a,b) => a + " " + b);
и сохраняет промежуточный массив (но для большого списка создает строки мусора O (n)).