当前位置:  开发笔记 > 编程语言 > 正文

使用分隔符加入字符串

如何解决《使用分隔符加入字符串》经验,为你挑选了5个好方法。

将字符串列表连接到组合分隔字符串的最佳方法是什么.我主要关注何时停止添加分隔符.我将使用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();

使用迭代器

再次来自乔恩

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

还有哪些其他算法?



1> Jon Skeet..:

由于不同的语言和平台处理不同的字符串,并为加入字符串列表提供不同级别的内置支持,因此不可能在此提供真正的语言无关的答案.你可以在两种不同的语言中使用几乎完全相同的代码,但在一种语言中它会很棒而在另一种语言中会很糟糕.

在C#中,您可以使用:

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

这将预先准备的所有逗号,但第一个项目.类似的代码在Java中也会很好.

编辑:这是一个替代方案,有点像伊恩后来的回答,但正在研究将军 IEnumerable.

// Change to IEnumerator for the non-generic IEnumerable
using (IEnumerator 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,自动调用ToString,并有一个过载IEnumerable.因此,无论如何,您不再需要上面的代码......对于.NET.



2> Ian Nelson..:

在.NET中,您可以使用String.Join方法:

string concatenated = String.Join(",", list.ToArray());

使用.NET Reflector,我们可以了解它是如何做到的:

public static unsafe string Join(string separator, string[] value, int startIndex, int count)
{
    if (separator == null)
    {
        separator = Empty;
    }
    if (value == null)
    {
        throw new ArgumentNullException("value");
    }
    if (startIndex < 0)
    {
        throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_StartIndex"));
    }
    if (count < 0)
    {
        throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NegativeCount"));
    }
    if (startIndex > (value.Length - count))
    {
        throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_IndexCountBuffer"));
    }
    if (count == 0)
    {
        return Empty;
    }
    int length = 0;
    int num2 = (startIndex + count) - 1;
    for (int i = startIndex; i <= num2; i++)
    {
        if (value[i] != null)
        {
            length += value[i].Length;
        }
    }
    length += (count - 1) * separator.Length;
    if ((length < 0) || ((length + 1) < 0))
    {
        throw new OutOfMemoryException();
    }
    if (length == 0)
    {
        return Empty;
    }
    string str = FastAllocateString(length);
    fixed (char* chRef = &str.m_firstChar)
    {
        UnSafeCharBuffer buffer = new UnSafeCharBuffer(chRef, length);
        buffer.AppendString(value[startIndex]);
        for (int j = startIndex + 1; j <= num2; j++)
        {
            buffer.AppendString(separator);
            buffer.AppendString(value[j]);
        }
    }
    return str;
}



3> Hank Gay..:

当一些语言在一行中提供支持时,没有什么理由使它与语言无关,例如Python

",".join(sequence)

有关详细信息,请参阅联接文档.



4> Christian Wi..:

对于python,请确保您有一个字符串列表,否则','.join(x)将失败.对于使用2.5+的安全方法

delimiter = '","'
delimiter.join(str(a) if a else '' for a in list_object)

"str(a)if a else''"适用于None类型,否则str()最终会生成'None',这不是很好;)



5> Jeremy L..:

在PHP的implode()中:

$string = implode($delim, $array);

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有