连接对象的字符串表示的好方法?

时间:2009-10-27 19:08:54

标签: c# optimization extension-methods memory-management

确定,

我们的代码中有很多 where 子句。我们有很多方法可以生成一个字符串来表示 in 条件。我想提出一个干净的方法如下:

public static string Join<T>(this IEnumerable<T> items, string separator)
{
    var strings = from item in items select item.ToString();
    return string.Join(separator, strings.ToArray());
}

可以按如下方式使用:

var values = new []{1, 2, 3, 4, 5, 6};
values.StringJoin(",");
// result should be:
// "1,2,3,4,5,6"

所以这是一个很好的扩展方法,可以完成一项非常基础的工作。我知道简单的代码并不总是变成快速或有效的执行,但我只是好奇我能用这个简单的代码错过了什么。我们团队的其他成员都在争论:

  • 它不够灵活(无法控制字符串表示)
  • 可能效率不高
  • 可能不会很快

任何专家来加入?

此致

埃里克。

5 个答案:

答案 0 :(得分:5)

关于第一个问题,您可以添加另一个'formatter'参数来控制每个项目转换为字符串:

public static string Join<T>(this IEnumerable<T> items, string separator)
{
    return items.Join(separator, i => i.ToString());
}

public static string Join<T>(this IEnumerable<T> items, string separator, Func<T, string> formatter)
{
    return String.Join(separator, items.Select(i => formatter(i)).ToArray());
}

关于后两个问题,我不担心它,除非你后来遇到性能问题并发现它是一个问题。然而,它不太可能成为瓶颈......

答案 1 :(得分:3)

出于某种原因,我认为String.Join是根据StringBuilder类实现的。但如果不是,则以下内容可能对大型输入执行得更好,因为它不会为迭代中的每个连接重新创建String对象。

public static string Join<T>(this IEnumerable<T> items, string separator)
{
    // TODO: check for null arguments.
    StringBuilder builder = new StringBuilder();
    foreach(T t in items)
    {
        builder.Append(t.ToString()).Append(separator);
    }

    builder.Length -= separator.Length;
    return builder.ToString();
}

编辑:以下an analysis适用于StringBuilderString.Join。{/ p>

答案 2 :(得分:0)

这也可以:

public static string Test(IEnumerable<T> items, string separator)
{
    var builder = new StringBuilder();
    bool appendSeperator = false;
    if(null != items)
    {
        foreach(var item in items)
        {
            if(appendSeperator)
            {
                builder.Append(separator)
            }

            builder.Append(item.ToString());

            appendSeperator = true;
        }
   }

   return builder.ToString();
}

答案 3 :(得分:0)

您缺少对序列和序列项的空检查。是的,它不是最快,最有效的内存方式。可能只需枚举序列并将项目的字符串表示形式呈现为StringBuilder。但这真的很重要吗?您是否遇到性能问题?你需要优化吗?

答案 4 :(得分:0)

为什么不使用StringBuilder,并自行遍历该集合,追加。 否则,您将创建一个字符串数组(var字符串),然后执行Join。