2013-02-16 5 views
1

Я извлек список пользователей из базы данных, что-то вродеКак преобразовать список в строку и обратно

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

Имени, LastName, DateOfBirth // многомерный массив ??

Теперь я хочу, чтобы сохранить этот список в виде строки, и я хочу иметь возможность повторно использовать его, т.е.

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

Как обновить список пользователей из strUsers?

Возможно ли это?

+0

Если у вас есть список пользователей, поэтому вам нужно обновить новый список? –

+0

см. Http://stackoverflow.com/questions/1666258/linq-to-generic-list?rq=1 –

+0

@DarrenDavies, если я хочу сохранить этот набор результатов темпа в БД в виде строки. – mko

ответ

1

Если у вас есть много пользователей и много столбцов, было бы лучше, чтобы написать свой собственный пользовательский класс конвертера.

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, чтобы создать свою пользовательскую строку. Вы также можете легко расширить преобразователь, чтобы учитывать различные разделители/дополнительную логику и т. Д.

Если вам нужно более общее решение (чтобы использовать его для любого класса), вы можете создать конвертер, который использует отражение для повторения все публичные поля, get/set properties, чтобы увидеть, что можно извлечь как строку, а затем перевернуть процесс, чтобы преобразовать вашу строку обратно в список.

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 [] {','}); 
+0

Как использовать несколько столбцов? имя, фамилия и т. д. – mko

+0

и User.Name не должны содержать запятые –

+0

@pavko_a: good point – Phil

0

Используйте этот код

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

var Array = combindedString.Split(new [] {','}); 
+0

Как получить его из массива в список ? – mko

1

Я думаю, что вы ищете, это то, что позволяет вам сбросить всех пользователей на строку и вернуть пользователей из строки, правильно?

я предлагаю что-то вроде этого: Добавить метод, который возвращает 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)

+0

интересный подход, но я не хочу использовать xml. я считаю, что это займет много места, так как я хочу сохранить временные результаты в виде строки в db. – mko

+0

Тогда JSON будет лучшим подходом. Прежде чем я создам много (возможно, бесполезный) код JSON, вы хотите JSON? –

+0

Json - это определенно вариант – mko

Смежные вопросы