如何将列表转换为字符串并返回
本文关键字:字符 字符串 串并 返回 转换 列表 | 更新日期: 2023-09-27 17:59:54
我从数据库中检索到一个用户列表,类似
List<User> users = <..list of users from db...>
Name,LastName,DateOfBirth//多维数组
现在我想将这个列表存储为字符串,并且我希望能够重用它,即
string strUsers = users.ToArray().ToString();
如何从strUsers重新创建用户列表?
有可能吗?
使用字符串。加入方法,例如
var joined = string.Join(",", users.Select(u => u.Name));
这将为您提供一个由","分隔的用户名字符串。
或者对于多列:
var joined = string.Join(",",
users.Select(u => u.FirstName + " " + u.LastName ));
您可以使用字符串反转该过程。拆分,例如
var split = joined.Split( new [] {','} );
如果您有很多用户和列,最好编写自己的自定义转换器类。
public static class UsersConverter
{
// Separates user properties.
private const char UserDataSeparator = ',';
// Separates users in the list.
private const char UsersSeparator = ';';
public static string ConvertListToString(IEnumerable<User> usersList)
{
var stringBuilder = new StringBuilder();
// Build the users string.
foreach (User user in usersList)
{
stringBuilder.Append(user.Name);
stringBuilder.Append(UserDataSeparator);
stringBuilder.Append(user.Age);
stringBuilder.Append(UsersSeparator);
}
// Remove trailing separator.
stringBuilder.Remove(stringBuilder.Length - 1, 1);
return stringBuilder.ToString();
}
public static List<User> ParseStringToList(string usersString)
{
// Check that passed argument is not null.
if (usersString == null) throw new ArgumentNullException("usersString");
var result = new List<User>();
string[] userDatas = usersString.Split(UsersSeparator);
foreach (string[] userData in userDatas.Select(x => x.Split(UserDataSeparator)))
{
// Check that user data contains enough arguments.
if (userData.Length < 2) throw new ArgumentException("Users string contains invalid data.");
string name = userData[0];
int age;
// Try parsing age.
if (!int.TryParse(userData[1], out age))
{
throw new ArgumentException("Users string contains invalid data.");
}
// Add to result list.
result.Add(new User { Name = name, Age = age });
}
return result;
}
}
使用StringBuilder构建用户字符串将在性能方面获胜。您还可以轻松地扩展转换器,以考虑不同的分隔符/附加逻辑等。
如果你需要一个更通用的解决方案(可以用于任何类),你可以创建一个转换器,它使用反射来迭代所有公共字段,获取/设置属性以查看可以提取为字符串的内容,然后反向将字符串转换回列表。
我认为您正在寻找的是一种可以将所有用户转储到字符串中并从字符串中获取用户的东西,对吗?
我建议这样做:添加一个向Users类型返回XElement的方法:
public XElement GetXElement()
{
return new XElement("User", new XElement("Name", this.FirstName)) //and so on...
}
然后将字符串解码为用户:
static User GetUserFromXElement(string xml)
{
XElement temp = XElement.Parse(xml);
User temp = new User();
foreach (XElement inner in temp.Elements())
{
switch inner.Name
{
case "Name":
temp.Name = inner.Value
break;
//whatever
}
}
}
然后这样做:
public string UsersToElements (List<Users> toWrite)
{
Stringbuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
XElement root = new XElement("root");
XDocument temp = new XDocument(root);
foreach (User user in toWrite)
{
root.Append(user.GetXElement());
}
temp.Save(sw);
return sw.ToString();
}
这个:
public List<Users> ElementsToUsers (string xml)
{
List<Users> usrsList = new List<Users>();
XDocument temp = XDocument.Load(xml);
foreach (XElement e in XDocument.Root.Elements())
{
usrsList.Append(Users.GetUserFromXElement(e));
}
return usrsList;
}
JSON解决方案(使用JSON.NET)
public JObject GetJObject()
{
return new JObject("user", new JProperty("name", this.FirstName)); //so on
}
static User GetUserFromJObject(string json)
{
JObject obj = JObject.Parse(json);
return new User() { FirstName = (string)obj["user"]["name"] }; //so on
}
public string UsersToElements (List<Users> users)
{
JObject root = new JObject(from usr in users select new JAttribute("user", usr.GetJObject());
return root.ToString();
}
public List<users> ElementsToUsers(string json)
{
List<Users> users = new List<Users>();
JObject temp = JObject.Parse(json);
foreach (JObject o in (JEnumerable<JObject>)temp.Children())
{
users.Add(Users.GetUserFromJObject(o.ToString());
}
return users;
}
我不知道它是否有效:/(我知道XML是有效的,对JSON不太确定)
使用此代码
string combindedString = string.Join( ",", myList );
var Array = combindedString.Split( new [] {','} );