将集合转换为字符串的最佳方法

时间:2010-09-04 19:45:42

标签: c# linq

我需要将<string,string>的集合转换为包含集合中所有值的单个字符串,如KeyValueKeyValue ......但我该如何有效地执行此操作?

我现在这样做了:

parameters = string.Join("", requestParameters.Select(x => string.Concat(x.Key, x.Value)));

但不确定这是最好的方法,字符串构建器会更好吗?我猜这个系列最多包含10对。

3 个答案:

答案 0 :(得分:5)

有了这么小的集合,没有太多的性能问题,但我可能只是使用StringBuilder来附加所有的值。

像这样:

var sb = new Text.StringBuilder;
foreach (var item in requestParameters)
{
    sb.AppendFormat("{0}{1}", item.Key, item.Value);
}
var parameters = sb.ToString();

答案 1 :(得分:5)

string.Join过去并不是最佳选择,因为它只接受string[]object[]个参数,要求任何select式查询都需要完全评估,首先放入阵列。

.NET 4.0带来了an overload that accepts IEnumerable<string> - 这就是你正在使用的 - 甚至是an overload that accepts any IEnumerable<T>。这些绝对是你最好的选择,因为它们现在是BCL的一部分。

顺便说一句,在Reflector中破解第一次重载的来源会显示与what davisoa suggested非常接近的代码:

public static string Join(string separator, IEnumerable<string> values)
{
    if (values == null)
    {
        throw new ArgumentNullException("values");
    }
    if (separator == null)
    {
        separator = Empty;
    }
    using (IEnumerator<string> enumerator = values.GetEnumerator())
    {
        if (!enumerator.MoveNext())
        {
            return Empty;
        }
        StringBuilder builder = new StringBuilder();
        if (enumerator.Current != null)
        {
            builder.Append(enumerator.Current);
        }
        while (enumerator.MoveNext())
        {
            builder.Append(separator);
            if (enumerator.Current != null)
            {
                builder.Append(enumerator.Current);
            }
        }
        return builder.ToString();
    }
}

换句话说,如果您要更改此代码以使用StringBuilder,那么您只需重写MS已为您编写的内容。

答案 2 :(得分:0)

字符串构建器没问题。使用append将每个字符串添加到字符串构建器。

基本上,concat,replace,join,string + string等的唯一原因被认为不是最好的,因为它们都会破坏当前的字符串&amp;重新创造一个新的。

所以当你添加10到12次的字符串时,它真的意味着你会破坏&amp;多次重新创建一个字符串。