【问题标题】:C# IEnumerable<Object> to stringC# IEnumerable<Object> 到字符串
【发布时间】:2010-11-25 05:36:28
【问题描述】:

出于记录目的,我想调用 object[] 数组中每个对象的 .ToString() 方法。我怎样才能以最简单的方式做到这一点?

说我有:

   myArray = new Object[]{"astring",1, Customer}

   Log(????);

我怎样才能传递一个字符串,比如它的值等于:

"astring".ToString()+1.ToString()+Customer.ToString()

或者更好,每个值之间用逗号分隔。

【问题讨论】:

标签: c# string ienumerable


【解决方案1】:

像这样:

Log(String.Join(", ", myArray.Select(o => o.ToString()).ToArray()));

更新:

从框架 4 开始,Join 方法也可以采用 IEnumerable&lt;string&gt;,因此您不需要 ToArray

Log(String.Join(", ", myArray.Select(o => o.ToString())));

【讨论】:

  • @Jonathan:正确。我总是这样写,所以我不知道为什么我这次没有……
  • 乔纳森,还有什么?如果您打算使用 String,为什么 C# 会附带别名?
  • @troethom:如果您使用别名字符串作为类型,代码的意图会更清楚一些,而当您在类中使用静态方法时使用类 String。
  • 什么更清楚?我真的认为不一致是不好的做法。
  • 顺便说一句,我认为 string 是 MS 标准;这就是 StyleCop 所强制执行的。
【解决方案2】:

MoreLINQ 有一个 ToDelimitedString 方法正是为了这个目的。

它使用StringBuilder 而不是String.Join(从我之前的问题中我记得,这两种方法的效率很大程度上取决于输入的内容)但它很简单。这是核心代码(有几个包装器允许使用默认分隔符):

private static string ToDelimitedStringImpl<TSource>
    (IEnumerable<TSource> source, string delimiter)
{
    Debug.Assert(source != null);
    Debug.Assert(delimiter != null);

    var sb = new StringBuilder();

    foreach (var value in source)
    {
        if (sb.Length > 0) sb.Append(delimiter);
        sb.Append(value);
    }

    return sb.ToString();
}

【讨论】:

  • 无需在每次迭代时检查 sb.Length。您可以通过返回 sb.ToString(1, sb.Length-1) 来丢弃第一个分隔符。
  • @gimel:考虑到长分隔符和空源,比这稍微复杂一些。不过还有更好的方法……我也不热衷于这里缺少牙套。我有时间会修复的:)
【解决方案3】:

我经常使用...

String.Join(", ", Array.ConvertAll<object, string>(myArray, Convert.ToString))

【讨论】:

    【解决方案4】:

    一种简单的老式方式:

    string myString = "";
    foreach(Object o in myArray)
        myString += o.ToString() + ", ";
    // Remove the extra comma
    if(myString.Length >=2)
        myString.Remove(myString.Length - 2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2012-07-24
      • 2021-10-08
      相关资源
      最近更新 更多