【问题标题】:string.Join(string, string[]) returns "System.String[]"string.Join(string, string[]) 返回“System.String[]”
【发布时间】:2013-05-07 13:31:53
【问题描述】:

我需要一些帮助。我有一个方法应该输出一个包含列表内容的 txt 文件(一行中的每个项目)。列表项是字符串数组。问题是当我调用 string.Join 它返回文字字符串 "System.String[]" 而不是实际的连接字符串。我在调试器中观察了它,列表及其数组具有正确的字符串。知道如何获取实际字符串以便将其写入 txt 文件吗?

这是我的代码:

 public void myMethod()
    {
        List<Array> list = new List<Array>();
        for (int i = 0; i < myGrid.Rows.Count; i++)
        {
            string[] linie = new string[3];
            linie[0] = myGrid.Rows[i].Cells[1].Value.ToString();
            linie[1] = myGrid.Rows[i].Cells[3].Value.ToString();
            linie[2] = myGrid.Rows[i].Cells[2].Value.ToString();

            {
                list.Add(linie);
            }
        }
        string path = "S:\\file.txt";
        StreamWriter file = new System.IO.StreamWriter(path);
        foreach (Array x in list)
        {
            string s = string.Join(",", x);
            file.WriteLine(s);
        }
            file.Close();
  }      

【问题讨论】:

  • 你试过string.Concat(",", x)吗?
  • @gwin003:那没用。
  • "SystemString[] " 是它返回的实际字符串。
  • 为什么将列表定义为 List 而不是 List?我猜它很困惑并使用 LINQ 连接方法(它将通用数组连接到另一个数组)而不是 string.join 方法,它将字符串数组连接到一个字符串中。
  • Array的所有用法更改为string[],它应该可以正常工作。

标签: c# arrays


【解决方案1】:

string.Join() 接受params object[]

当您传递编译时类型的变量 Array 时,它会将其解释为数组中的单个项目,并最终传递 new object[] { yourArray }
然后它在单个项目上调用ToString(),返回类型名称(因为数组不会覆盖ToString()

要解决此问题,您需要将 Array 更改为任何强类型集合类型(string[]object[]IEnumerable&lt;string&gt;)。
然后它将数组本身传递给Join(),而不是假设它是参数数组中的单个参数。

【讨论】:

  • 感谢您真正理解了真正的问题。问题中的格式可以保存,呵呵。来自我的 +1。
  • @Niels:我完全误解了这个问题。请参阅我编辑的答案。
  • 大声笑,到处都是混乱。我会稍微编辑一下问题以澄清。
  • 一般的教训是避免使用Array
  • 感谢 SLaks 和其他人的回答。我会将此标记为答案。感谢 Niels 澄清问题。
【解决方案2】:

改变类型

List<Array> list = new List<Array>();

List<string[]> list = new List<string[]>();

您可以使用File.WriteAllLines

string[] contents = list.Select(a => string.Join(",", a)).ToArray();

File.WriteAllLines(path, contents);

【讨论】:

    【解决方案3】:

    这是您获得这些结果的原因

    string.Join 的重载是:

    Join(string, params object[])
    Join(string, params string[])
    Join(string, params string[], int, int)
    Join(string, IEnumerable<string>)
    Join<T>(string, IEnumerable<string>)
    

    由于string.Join 的第二个参数是无类型的Array,既不是string[] 也不是IEnumerable&lt;T&gt;,“最佳”重载是Join(string, params object[])Array 被处理为@ 987654328@ 具有单个值 - Array(不是具有多个 stringobject 值的 object[])。所以 Join 在Array 上调用ToString(),它返回System.String[],因为那是数组的实际类型

    有多种方法可以修复它,但对我来说最干净的是使用List&lt;string[]&gt; 而不是List&lt;Array&gt;,因为您只在数组中存储字符串。这样,将调用重载 'Join(string, string[])`,从而为您提供预期的结果:

    public void myMethod()
    {
        List<string[]> list = new List<string[]>();
        for (int i = 0; i < myGrid.Rows.Count; i++)
        {
            string[] linie = new string[3];
            linie[0] = myGrid.Rows[i].Cells[1].Value.ToString();
            linie[1] = myGrid.Rows[i].Cells[3].Value.ToString();
            linie[2] = myGrid.Rows[i].Cells[2].Value.ToString();
    
            {
                list.Add(linie);
            }
        }
        string path = "S:\\file.txt";
        StreamWriter file = new System.IO.StreamWriter(path);
        foreach (string[] x in list)
        {
            string s = string.Join(",", x);
            file.WriteLine(s);
        }
            file.Close();
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2018-03-09
      • 2015-09-02
      相关资源
      最近更新 更多