使用分隔符连接字符串

30

如何将字符串列表连接成一个以分隔符为分隔的字符串?主要关注何时停止添加分隔符,使用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循环的变化

来自Jon的解决方案。

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

使用迭代器

再次来自Jon

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

还有哪些其他算法?


在你的foreach循环中,不要忘记将first设置为false。 - tehvan
如果您希望这是语言无关的,那么您不应该担心C#特定的优化(例如StringBuilder)。 - mpen
25个回答

0

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

在编程时,我最讨厌的事情之一就是制作逗号分隔的 ID 列表,这很简单,但总是有丑陋的代码... 常见的解决方案是循环遍历每个项并在其后放置逗号,然后删除最后一个字符,或者使用 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
Groovy还有一个String Object.join(String)方法。

0
你可以编写自己的方法 AppendTostring(string, delimiter),只有在字符串不为空时才附加分隔符。然后,在任何循环中调用该方法,而无需担心何时附加和何时不附加。
编辑:如果可用的话,最好在方法中使用某种StringBuffer。

0
在.NET中,如果可能的话,我会使用String.join方法,它允许您指定分隔符和字符串数组。可以使用ToArray将列表转换为数组,但我不知道那样会带来什么性能问题。
你提到的三个算法是我会用的(我喜欢第二个,因为它没有if语句,但如果长度未知,我会使用第三个,因为它不会复制代码)。第二种方法只适用于列表不为空的情况,因此可能需要另一个if语句。
第四个变体可能是在连接每个元素之前放置一个分隔符,然后从结果中删除第一个分隔符。
如果您确实在循环中连接字符串,请注意,对于非平凡情况,使用stringbuilder将远远优于重复的字符串连接。

0

Java(来自Jon的解决方案):

    StringBuilder sb = new StringBuilder();
    String delimiter = "";
    for (String item : items) {
        sb.append(delimiter).append(item);
        delimeter = ", ";
    }
    return sb.toString();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接