2

次のようなデータベースからユーザーのリストを取得しました

List<User> users = <..list of users from db...> 

Name, LastName, DateOfBirth //多次元配列??

今、このリストを文字列として保存し、再利用できるようにしたい

string strUsers = users.ToArray().ToString();

strUsers からユーザーのリストを再作成する方法は?

出来ますか?

4

4 に答える 4

8

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 [] {','} );
于 2013-02-16T17:03:32.573 に答える
3

多数のユーザーと多数の列がある場合は、独自のカスタムコンバータークラスを作成することをお勧めします。

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を使用してユーザーの文字列を構築すると、パフォーマンスが向上します。コンバーターを簡単に拡張して、さまざまなセパレーター/追加ロジックなどを考慮することもできます。

より一般的なソリューションが必要な場合(任意のクラスで使用できるようにするため)、リフレクションを使用してすべてのパブリックフィールドを反復処理し、プロパティを取得/設定して文字列として抽出できるものを確認し、後で逆にするコンバーターを作成できます。文字列をリストに戻すプロセス。

于 2013-02-16T17:34:55.573 に答える
1

あなたが探しているのは、すべてのユーザーを文字列にダンプし、文字列からユーザーを取り戻すことができるものだと思いますよね?

次のようなことをお勧めします: 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についてはよくわかりません)

于 2013-02-16T17:51:42.857 に答える
0

このコードを使用

string combindedString = string.Join( ",", myList );

var Array = combindedString.Split( new [] {','} );
于 2013-02-16T17:25:59.947 に答える