小编典典

使用分隔符连接字符串

algorithm

将字符串列表连接到组合的定界字符串中的最佳方法是什么。我主要关心何时停止添加定界符。我将使用C#作为示例,但是我希望这与语言无关。

编辑:我没有使用StringBuilder使代码稍微简单些。

使用For循环

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

使用For循环设置之前的第一项

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;
}

foreach循环的变化

从乔恩的解决方案

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();
}

还有哪些其他算法?


阅读 264

收藏
2020-07-28

共1个答案

小编典典

由于不同的语言和平台对字符串的处理方式不同,并且无法为连接字符串列表提供不同级别的内置支持,因此在此处无法给出与语言无关的答案。您可以使用两种不同的语言编写
几乎完全相同的 代码,而用一种语言编写则效果很好,而用另一种语言编写则效果很差。

在C#中,您可以使用:

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

除第一个项目外,这将在所有项目前 一个逗号。类似的代码在Java中也是不错的。

编辑:这是另一种选择,有点像伊恩(Ian)后来的回答,但正在研究将军 IEnumerable<string>

// Change to IEnumerator for the non-generic IEnumerable
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();
}

编辑原始答案后将近5年…

在.NET 4中,string.Join相当明显地过载了。有一个IEnumerable<T>自动调用ToString的重载,并且有一个重载IEnumerable<string>。因此,无论如何,您都不需要.NET之上的代码。

2020-07-28