2010-06-08 4 views
1

나는이 같은 문자열이 있습니다
"사용자 = U123을, 이름 = 시험, LASTNAME = 사용자"이 같은 문자열에 대한 사전 싶어어떻게 변경할 수 있습니다 ";" 어떤 종류의 사전에 분리 된 문자열?

:

user  "u123" 
name  "Test" 
lastname "User" 

이 방법 I 문자열 내의 데이터에 쉽게 액세스 할 수 있습니다.

C#에서이 작업을 수행하려고합니다.

편집 :
이것은 내가 지금까지 무엇을 가지고 :

public static Dictionary<string, string> ValueToDictionary(string value) 
{ 
    Dictionary<string, string> result = null; 

    result = new Dictionary<string, string>(); 
    string[] values = value.Split(';'); 

    foreach (string val in values) 
    { 
     string[] valueParts = val.Split('='); 
     result.Add(valueParts[0], valueParts[1]); 
    } 

    return result; 
} 

하지만 난 정말이 할 수있는 더 나은 방법이 있다고 생각 솔직히 말해서.

건배, M.

+4

지금 가지고있는 것보다 더 좋아질 것은 없습니다. 현재, 아래의 해답은 모두 자신의 코드보다 읽기가 더 어렵습니다. 당신이 할 수있는 유일한 개선점은 (현재의 답변보다 더 읽을 수 없게 만드는 비용으로) 더 빨리 만들 수 있지만, 아마도 더 빨라질 필요가 없을 것입니다. – Joren

+5

코드가 읽기 쉽고 LINQ 솔루션보다이 솔루션을 선호합니다. – RvdK

+1

대부분의 솔루션에서 split을 사용합니다. 한 생각이 내 마음을 넘어 섰다. 공백이 없다는 것을 보장 할 수 있겠습니까? 그렇다면, 일부 트리밍 논리를 추가하거나 주석에 정규식 – Simon

답변

2

분할하여 문자열 ";".

결과 배열의 모든 요소를 ​​반복하고 모든 요소를 ​​"="로 나눕니다.

지금; dictionary.add (요소 [0], 요소 [1]);

나는 그것을 충분히 분명히하기를 희망한다.

1
var dictionary = new Dictionary<string, string>(); 
var linedValue = "user=u123;name=Test;lastname=User"; 
var kvps = linedValue.Split(new[] { ';' }); // you may use StringSplitOptions.RemoveEmptyEntries 
foreach (var kvp in kvps) 
{ 
    var kvpSplit = kvp.Split(new[] { '=' }); 
    var key = kvpSplit.ElementAtOrDefault(0); 
    var value = kvpSplit.ElementAtOrDefault(1); 
    dictionary.Add(key, value); 
    // you may check with .ContainsKey if key is already persistant 
    // you may check if key and value with string.IsNullOrEmpty 
} 
1
Dictionary<string, string> d = new Dictionary<string, string>(); 
string s1 = "user=u123;name=Test;lastname=User"; 
foreach (string s2 in s1.Split(';')) 
{ 
    string[] split = s2.Split('='); 
    d.Add(split[0], split[1]); 
} 
3

당신은 LINQ를 사용할 수 있습니다

var text = "user=u123;name=Test;lastname=User"; 
var dictionary = (from t in text.Split(";".ToCharArray()) 
        let pair = t.Split("=".ToCharArray(), 2) 
        select pair).ToDictionary(p => p[0], p => p[1]); 
0

을 당신이 당신의 입력 데이터에는 분리 문자, 다음 작품

string input = "user=u123;name=Test;lastname=User"; 
string[] fragments = input.Split(";=".ToArray()); 
Dictionary<string,string> result = new Dictionary<string,string>() 
for(int i=0; i<fragments.Length-1;i+=2) 
    result.Add(fragments[i],fragments[i+1]); 

그것은 약간 더 수행 할 수가 없음을 확실히 알고있는 경우 한 번만 Split()을 호출하기 때문에 다른 솔루션보다 일반적으로 코드의 가독성이 당신에게 가치있는 것이라면 여기 다른 솔루션 중 하나를 선택합니다.

0
내가 이런 식으로 할 것이라고 생각

...

String s = "user=u123;name=Test;lastname=User"; 
Dictionary<string,string> dict = s.ToDictionary(); 

ToDictonary의 구현은 내가 extension method로 구현하는 것을 제외하고 당신과 동일합니다. 더 자연스러워 보입니다.

관련 문제