2013-02-16 3 views
1

나는,어떻게 문자열로 목록을 변환하고 다시

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

이름, 성, 생년월일 (DateOfBirth) // 다차원 배열 뭔가를 데이터베이스에서 사용자 목록을 검색?

는 지금은 문자열로이 목록을 저장할 그리고 그것이 즉

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

방법 strUsers에서 사용자 목록을 다시 재사용 할 수있을까요?

가능합니까?

+0

)을 JSON에 대해 너무 확실하지 않습니다 새 목록? –

+0

참조 DB에서이 임시 결과 집합을 문자열로 저장하려면 @DarrenDavies http://stackoverflow.com/questions/1666258/linq-to-generic-list?rq=1 –

+0

을 참조하십시오. – 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를 사용하면 성능이 현저하게 향상됩니다. 당신은 또한 다른 분리 자/추가 로직 등을 고려하여 변환기를 쉽게 확장 할 수 있습니다.

보다 일반적인 솔루션이 필요한 경우 (어떤 클래스에도 사용할 수 있음) 리플렉션을 사용하여 반복하는 변환기를 만들 수 있습니다 모든 공개 필드, 속성을 가져 오거나 설정하여 문자열로 추출 할 수있는 것을 확인한 다음 나중에 문자열을 목록으로 다시 변환하는 프로세스를 되돌립니다.

8

string.Join 방법을 사용하십시오.

var joined = string.Join(",", users.Select(u => u.Name)); 

이렇게하면 ','로 구분 된 사용자 이름의 단일 문자열을 얻을 수 있습니다. 당신은 string.Split를 사용하여 프로세스를 취소 할 수 있습니다

var joined = string.Join(",", 
       users.Select(u => u.FirstName + " " + u.LastName)); 

, 예를 들면 :

또는 여러 열에 대한

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

여러 열을 사용하면 어떨까요? 이름, 성 등 .... – mko

+0

및 User.Name에는 쉼표가 포함되어서는 안됩니다 –

+0

@pavko_a : 좋은 점 – Phil

0

사용이 많은 사용자와 열이 많은 경우이 코드

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

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

배열에서 목록으로 이동하는 방법 ? – mko

1

내가 원하는 것은 모든 사용자를 문자열로 덤프하고 문자열에서 사용자를 되 찾을 수 있다고 생각하는 것입니다.

나는이 같은 제안 : 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 사용.THS가 작동하는 경우 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 당신이 다시 작성해야 할 이유를 사용자의 목록이있는 경우는

+0

흥미로운 접근 방식이지만 XML을 사용하고 싶지 않습니다. 나는 DB에서 문자열로 임시 결과를 저장하려고하므로 많은 공간이 필요하다고 생각합니다. – mko

+0

그러면 JSON이 더 나은 방법이 될 것입니다. 내가 (쓸모없는) JSON 코드를 많이 만들기 전에 JSON을 원하십니까? –

+0

Json은 확실히 옵션입니다. – mko

관련 문제