4

我需要一些帮助。我有一个方法应该输出一个包含列表内容的 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();
  }      
4

3 回答 3

17

string.Join()需要一个params object[].

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

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

于 2013-05-07T13:33:55.363 回答
3

更改类型

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);
于 2013-05-07T13:39:19.773 回答
2

以下是您获得这些结果的原因:

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>)

由于您的第二个参数 tostring.Join是 untyped Array,既不是 astring[]也不是 an IEnumerable<T>,因此“最佳”重载是Join(string, params object[]),Array处理的 anobject[]具有单个值 - the Array(不是object[]具有多个stringobject值的 an )。所以 Join 调用ToString()Array它返回,System.String[]因为那是 Array 的 actula类型

有多种方法可以修复它,但对我来说最干净的是使用,List<string[]>而不是List<Array>因为你只在数组中存储字符串。这样,将调用重载 '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();
} 
于 2013-05-07T13:48:39.037 回答