Подтвердить что ты не робот

Самый элегантный способ вернуть строку из списка <int>

Каков самый элегантный способ вернуть строку из списка хорошо, да, я знаю, я могу сделать что-то вроде

public string Convert(List<int> something)
{
    var s = new StringBuilder();
    foreach(int i in something)
        s.AppendFormat("{0} ", i);

    return s.ToString();
}

но я уверен, что есть способ сделать это с lambdas Я также попытался добавить в построитель строк, но это не делает ожидаемые

4b9b3361

Ответ 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)).