best way to convert collection to string

Ras*_*sen 5 c# linq

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

我现在这样做了:

parameters = string.Join("", requestParameters.Select(x => string.Concat(x.Key, x.Value)));
Run Code Online (Sandbox Code Playgroud)

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

dav*_*soa 5

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

像这样:

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


Dan*_*Tao 5

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

.NET 4.0带来了一个接受的重载IEnumerable<string> - 这就是你正在使用的 - 甚至是一个接受任何的重载 IEnumerable<T>.这些绝对是您最好的选择,因为他们现在是BCL的一部分.

顺便说一句,为Reflector中的第一个重载打开源代码显示的代码与davisoa建议的内容非常接近:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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