次のようなデータベースからユーザーのリストを取得しました
List<User> users = <..list of users from db...>
Name, LastName, DateOfBirth //多次元配列??
今、このリストを文字列として保存し、再利用できるようにしたい
string strUsers = users.ToArray().ToString();
strUsers からユーザーのリストを再作成する方法は?
出来ますか?
string.Joinメソッドを使用します。
var joined = string.Join(",", users.Select(u => u.Name));
これにより、「,」で区切られたユーザー名の単一の文字列が得られます。
または複数の列の場合:
var joined = string.Join(",",
users.Select(u => u.FirstName + " " + u.LastName ));
string.Splitを使用してプロセスを逆にすることができます。
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を使用してユーザーの文字列を構築すると、パフォーマンスが向上します。コンバーターを簡単に拡張して、さまざまなセパレーター/追加ロジックなどを考慮することもできます。
より一般的なソリューションが必要な場合(任意のクラスで使用できるようにするため)、リフレクションを使用してすべてのパブリックフィールドを反復処理し、プロパティを取得/設定して文字列として抽出できるものを確認し、後で逆にするコンバーターを作成できます。文字列をリストに戻すプロセス。
あなたが探しているのは、すべてのユーザーを文字列にダンプし、文字列からユーザーを取り戻すことができるものだと思いますよね?
次のようなことをお勧めします: XElement を Users 型に返すメソッドを追加します。
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 [] {','} );