用逗号分隔连接一个对象值的最佳方法? C#

时间:2014-03-19 09:45:01

标签: c# linq

我找到了一种方法来做到这一点,但我只是想知道是否有一种直接的方法来做到这一点。

所以我有Artist对象的列表,我想打印出所有艺术家的名字作为一个逗号分隔的字符串。

这是我实现此目的的代码

string.Join(",",Artists.Select(a => a.ArtistName).ToArray());

或者我应该使用ToString方法?

5 个答案:

答案 0 :(得分:6)

从.NET框架版本4开始,这应该足够了

string s = string.Join(",",Artists.Select(a => a.ArtistName));

答案 1 :(得分:2)

这取决于“最佳”的意思。

一般来说,你拥有它的方式最好是在.NET 4.0之前,而从最好的方式来看4.0就是省略.ToArray(),因为从那个版本开始就有Join的形式需要IEnumerable<string>,因此您不需要花费时间和内存来创建数组。

现在,如果我们在.NET 4.0之前工作,我们可以使用该版本创建自己的版本:

public static class StringMore
{
//You might want to use conditional statements to mark this as obsolete in 4.0 or higher
  public static string Join(string separator, IEnumerable<string> values)
  {
    if (values == null)
      throw new ArgumentNullException("values");
    if (separator == null)
      separator = string.Empty;
    using (IEnumerator<string> en = values.GetEnumerator())
    {
      if (!en.MoveNext())
        return "";
      StringBuilder sb = new StringBuilder(en.Current);
      while(en.MoveNext())
      {
        stringBuilder.Append(separator);
        stringBuilder.Append(en.Current);
      }
      return sb.ToString();
    }
  }
  public static string Join<T>(string separator, IEnumerable<T> values)
  {
    if (values == null)
      throw new ArgumentNullException("values");
    if (separator == null)
      separator = string.Empty;
    using (IEnumerator<string> en = values.GetEnumerator())
    {
      if (!en.MoveNext())
        return "";
      T cur = en.Current;
      StringBuilder sb = cur == null ? new StringBuilder() : new StringBuilder(cur.ToString());
      while(en.MoveNext())
      {
        stringBuilder.Append(separator);
        cur = en.Current;
        if(cur != null)
          stringBuilder.Append(cur.ToString());
      }
      return sb.ToString();
    }
  }
}

然后你可以使用StringMore.Join(",",Artists.Select(a => a.ArtistName))来获得.NET 3.5中的结果,这些结果几乎(不像我们缺少.NET内部的StringBuilder缓存一样)效率高达4.0。这是否“更好”取决于性能增益是否值得额外工作以及添加更多方法的错误检查的额外复杂性,这取决于调用在实践中的重量(多少元素)以及它们的频率被击中了。

答案 2 :(得分:1)

您的解决方案是正确的方法。你&#34;可能&#34;覆盖对象Artists的ToString方法,但string.Join是首选方法。

答案 3 :(得分:0)

separateor可能是“,”

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

答案 4 :(得分:-1)

我更喜欢在这里创建自己的方法,以使我的代码“看起来更好”。所以我会对艺术家名单进行扩展。

public static class ArtistListExtensions
{
    public static String unionNames(this List<Artist> artists, String seperator)
    {
        return string.Join(seperator, artists.Select(a => a.ArtistName));
    }
}

我现在只需使用此扩展程序:

artists.unionNames(", ");