假设我在C#中有一个对象数组,我想把它写成CSV格式的文件.
假设每个对象都有一个ToString()方法,这就是我想要打印的方法.
目前我正在使用此代码:
public static void dumpArray(Array arr, string fileName)
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileName))
{
foreach (Object obj in arr)
{
file.Write(obj.ToString()+",");
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么内置在C#框架中,或者你认为有更好的方法吗?
Ode*_*ded 12
使用String.Join:
using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileName))
{
file.Write(string.Join(",", arr));
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您确实在编写CSV文件,则应使用CSV库,例如文件助手,因为CSV并不像大多数人想象的那样简单 - 请参阅RFC 4180.
请注意,假设你有一个string[]作为第二个参数-你似乎在传递的一个实例Array类(这是不是一个string[]为你写你的问题).
更新:
由于您没有传入a string[],因此您应该使用文件助手来确保将对象正确写入CSV.
您可以更改方法以使用C#Generics并使用描述性函数和变量名称.这实际上导致相同的行为,除了对值类型避免装箱.
public static void SaveArrayAsCSV<T>(T[] arrayToSave, string fileName)
{
using (StreamWriter file = new StreamWriter(fileName))
{
foreach (T item in arrayToSave)
{
file.Write(item + ",");
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:对锯齿状数组做同样的事情(假设它们只包含一个嵌套级别)你可以使用这个重载(不推荐,见下文!):
public static void SaveArrayAsCSV<T>(T[][] jaggedArrayToSave, string fileName)
{
using (StreamWriter file = new StreamWriter(fileName))
{
foreach (T[] array in jaggedArrayToSave)
{
foreach (T item in array)
{
file.Write(item + ",");
}
file.Write(Environment.NewLine);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,上述解决方案是次优的,因为它仅适用于某些特定场景(我们只有一个嵌套级别).不幸的是,如果重构我们的代码,我们必须停止使用泛型,因为我们的输入数组现在可能包含Type T或Type的元素T[].因此,我们提出以下代码,这是首选的解决方案,因为虽然它重新引入了装箱,但是更具可读性,更少冗余,适用于更广泛的场景:
public static void SaveArrayAsCSV(Array arrayToSave, string fileName)
{
using (StreamWriter file = new StreamWriter(fileName))
{
WriteItemsToFile(arrayToSave, file);
}
}
private static void WriteItemsToFile(Array items, TextWriter file)
{
foreach (object item in items)
{
if (item is Array)
{
WriteItemsToFile(item as Array, file);
file.Write(Environment.NewLine);
}
else file.Write(item + ",");
}
}
Run Code Online (Sandbox Code Playgroud)