保存到 csv 后数据有奇怪的格式

Data has strange format after saved to csv

保存到 csv 后的数据格式如屏幕截图所示:

这是我的 C# 代码。

UserDataDBsDataContext dataContext = new UserDataDBsDataContext();
            List<UserData> usersL = (from u in dataContext.UserDatas
                                         //where u.Id.Equals(13)
                                     select u).ToList();

 StreamWriter writer = new StreamWriter("my_data.txt");
 string csv = String.Join(",", usersL.Select(x => x.ToString()).ToArray());            
 writer.Write(csv);

 writer.Close();

你知道我遗漏了什么或者我做错了什么吗?

更新:UserData.Properties:

在这里我可以 select 属性 通过 属性:

foreach (var i in usersL)
{
    writer.Write(i.Id);               
}

但我想获取整个对象,因为稍后它会上传到我的应用程序。

.NET 中对象的默认 .ToString() 只写对象的全名(因此在您的情况下 "LayoutMVVM.LinqToSqlClasses.UserData")。您必须重载 .ToString() 或手动编写数据。请注意,直接编写 CSV 很容易出现问题……转义 CSV 很复杂(例如转义 This is a "quoted" string 或换行)。搜索正确执行此操作的库。

使用此代码

String.Join(",", usersL.Select(x => x.ToString()).ToArray());   

您正在从 UserData 个实例中调用 ToString() 方法。默认情况下,您将在调用 ToString() 方法时获得 class 的命名空间。如果您想将数据写入您的 csv 文件,您必须从您的实例中获取值。

一种方法是使用此代码

var lines = usersL.Select(x => string.Format("{0},{1},{2},{3}", x.Id, x.FirstName, x.LastName, x.Type))
                  .ToList();

File.WriteAllLines("my_data.txt", lines);

您也可以覆盖 UserData 的 ToString() 方法。但是,在我看来,这不是一种干净的方式,因为 UserData class 不应该知道它在 csv 文件中的保存方式。

/编辑:使用反射

var properties = typeof(UserData).GetProperties();
var userValues = new List<string>();

foreach (var user in usersL)
{
    var values = new List<object>();
    foreach (var property in properties)
    {
        object value = property.GetValue(user, null);
        values.Add(value);
    }
    userValues.Add(string.Join(",", values));
}

File.WriteAllLines("my_data.txt", userValues);

尝试使用这样的东西:

Type t = typeof(UserData);
PropertyInfo[] propInfos = t.GetProperties(BindingFlags.Public|BindingFlags.Instance);


using(StreamWriter writer = new StreamWriter("my_data.txt"))
{

    foreach(var user in usersL)
    {

        List<object> propValues = new List<object>();
        foreach(var pi in propInfos)
        {
            propValues.Add(pi.GetValue(user, null));
        }

        string csvLine = String.Join(",", propValues); 

        writer.WriteLine(csvLine);
    }
}