Присоедините строку, используя разделители - PullRequest
22 голосов
/ 24 февраля 2009

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

РЕДАКТИРОВАТЬ: я не использовал StringBuilder, чтобы сделать код немного проще.

Используйте цикл For *

for(int i=0; i < list.Length; i++)
{
    result += list[i];
    if(i != list.Length - 1)
        result += delimiter;
}

Использовать For Loop для установки первого элемента ранее

result = list[0];
for(int i = 1; i < list.Length; i++)
    result += delimiter + list[i];

Они не будут работать для IEnumerable, где вы заранее не знаете длину списка, поэтому

Использование цикла foreach

bool first = true;
foreach(string item in list)
{
    if(!first)
        result += delimiter;
    result += item;
    first = false;
}

Изменение цикла по каждому элементу

Из решения Джона

StringBuilder builder = new StringBuilder();
string delimiter = "";
foreach (string item in list)
{
    builder.Append(delimiter);
    builder.Append(item);
    delimiter = ",";       
}
return builder.ToString();

Использование итератора

Снова от Джона

using (IEnumerator<string> iterator = list.GetEnumerator())
{
    if (!iterator.MoveNext())
        return "";
    StringBuilder builder = new StringBuilder(iterator.Current);
    while (iterator.MoveNext())
    {
        builder.Append(delimiter);
        builder.Append(iterator.Current);
    }
    return builder.ToString();
}

Какие еще есть алгоритмы?

Ответы [ 24 ]

0 голосов
/ 24 февраля 2009

С http://dogsblog.softwarehouse.co.zw/post/2009/02/11/IEnumerable-to-Comma-Separated-List-(and-more).aspx

Моя любимая ненависть при разработке заключается в создании списка идентификаторов, разделенных запятыми, это НАСТОЛЬКО просто, но всегда имеет ужасный код .... Обычные решения - циклически проходить и ставить запятую после каждого элемента, затем удалять последний символ или иметь оператор if, чтобы проверить, есть ли у вас начало или конец списка. Ниже приведено решение, которое вы можете использовать в любом IEnumberable, например, List, Array и т. Д. Это также самый эффективный способ сделать это, так как он основан на присваивании, которое лучше, чем редактирование строки или использование if.

public static class StringExtensions
{
    public static string Splice<T>(IEnumerable<T> args, string delimiter)
    {
        StringBuilder sb = new StringBuilder();
        string d = "";
        foreach (T t in args)
        {
            sb.Append(d);
            sb.Append(t.ToString());
            d = delimiter;
        }
        return sb.ToString();
    }
}

Теперь его можно использовать с любым IEnumerable, например.

StringExtensions.Splice (billingTransactions.Select (t => t.id), ",")

чтобы дать нам 31,32,35

0 голосов
/ 24 февраля 2009

В .NET я бы по возможности использовал метод String.join, который позволяет вам указывать разделитель и строковый массив. Список можно преобразовать в массив с помощью ToArray, но я не знаю, как это повлияет на производительность.

Три алгоритма, которые вы упомянули, это то, что я бы использовал (мне нравится второй, потому что в нем нет оператора if, но если длина неизвестна, я бы использовал третий, потому что он не дублирует код) , Второй будет работать только в том случае, если список не пуст, так что может потребоваться другой оператор if.

Четвертый вариант может заключаться в том, чтобы поместить разделитель перед каждым объединенным элементом, а затем удалить первый разделитель из результата.

Если вы объединяете строки в цикле, обратите внимание, что для нетривиальных случаев использование строителя строк значительно превзойдет повторные объединения строк.

0 голосов
/ 23 апреля 2017

Java (из решения Джона):

    StringBuilder sb = new StringBuilder();
    String delimiter = "";
    for (String item : items) {
        sb.append(delimiter).append(item);
        delimeter = ", ";
    }
    return sb.toString();
0 голосов
/ 24 февраля 2009
string result = "";
foreach(string item in list)
{
    result += delimiter + item;
}
result = result.Substring(1);

Edit: Конечно, вы не будете использовать этот или любой из ваших алгоритмов для объединения строк. С C # /. NET вы, вероятно, использовали бы StringBuilder:

StringBuilder sb = new StringBuilder();
foreach(string item in list)
{
    sb.Append(delimiter);
    sb.Append(item);
}
string result = sb.ToString(1, sb.Length-1);

И вариант этого решения:

StringBuilder sb = new StringBuilder(list[0]);
for (int i=1; i<list.Count; i++)
{
    sb.Append(delimiter);
    sb.Append(list[i]);
}
string result = sb.ToString();

Оба решения не включают никаких проверок ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...