我需要一些帮助。我有一个方法应该输出一个包含列表内容的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();
}
答案 0 :(得分:14)
string.Join()
需要params object[]
。
当您传递编译时类型Array
的变量时,它会将其解释为数组中的单个项目,并最终传递new object[] { yourArray }
。
然后它会在单个项目上调用ToString()
,这会返回类型名称(因为数组不会覆盖ToString()
。
要解决此问题,您需要将Array
更改为任何强类型集合类型(string[]
,object[]
或IEnumerable<string>
)。
然后它会将数组本身传递给Join()
,而不是假设它是paramarray中的单个参数。
答案 1 :(得分: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);
答案 2 :(得分: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>)
由于您的string.Join
的第二个参数是无类型Array
,既不是string[]
也不是IEnumerable<T>
,“最佳”重载是Join(string, params object[])
,Array
处理的object[]
只有一个值 - Array
(不是具有多个object[]
或string
值的object
。所以加入ToString()
上的Array
来电,返回System.String[]
,因为这是数组的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();
}