web-dev-qa-db-ja.com

文字列を辞書に分割する方法

私はこのひもを持っています

string sx="(colorIndex=3)(font.family=Helvetica)(font.bold=1)";

そしてそれを分割しています

string [] ss=sx.Split(new char[] { '(', ')' },
    StringSplitOptions.RemoveEmptyEntries);

その代わりに、結果をDictionary<string,string>?結果の辞書は次のようになります。

Key          Value
colorIndex   3
font.family  Helvetica
font.bold    1
34
TonyP

より効率的な方法があるかもしれませんが、これはうまくいくはずです:

string sx = "(colorIndex=3)(font.family=Helvicta)(font.bold=1)";

var items = sx.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(s => s.Split(new[] { '=' }));

Dictionary<string, string> dict = new Dictionary<string, string>();
foreach (var item in items)
{
    dict.Add(item[0], item[1]);
}
21
Fredrik Mörk

これは、LINQToDictionary()拡張メソッドを使用して実行できます。

string s1 = "(colorIndex=3)(font.family=Helvicta)(font.bold=1)";
string[] t = s1.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries);

Dictionary<string, string> dictionary =
                      t.ToDictionary(s => s.Split('=')[0], s => s.Split('=')[1]);

[〜#〜] edit [〜#〜]:同じ結果は、2回分割することなく達成できます。

Dictionary<string, string> dictionary =
           t.Select(item => item.Split('=')).ToDictionary(s => s[0], s => s[1]);
75
Elisha

ランダムシュワルツ には 経験則 があります:何を捨てたいかわかっている場合はスプリットを使用し、何をしたいかわかっている場合は正規表現を使用します保つ。

何を保持したいかがわかります。

string sx="(colorIndex=3)(font.family=Helvetica)(font.bold=1)";

Regex pattern = new Regex(@"\((?<name>.+?)=(?<value>.+?)\)");

var d = new Dictionary<string,string>();
foreach (Match m in pattern.Matches(sx))
  d.Add(m.Groups["name"].Value, m.Groups["value"].Value);

少しの努力で、 ToDictionary でそれを行うことができます:

var d = Enumerable.ToDictionary(
  Enumerable.Cast<Match>(pattern.Matches(sx)),
  m => m.Groups["name"].Value,
  m => m.Groups["value"].Value);

これがもっとよく見えるかどうかわかりません:

var d = Enumerable.Cast<Match>(pattern.Matches(sx)).
  ToDictionary(m => m.Groups["name"].Value,
               m => m.Groups["value"].Value);
19
Greg Bacon
string sx = "(colorIndex=3)(font.family=Helvetica)(font.bold=1)";

var dict = sx.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
             .Select(x => x.Split('='))
             .ToDictionary(x => x[0], y => y[1]);
13
LukeH
var dict = (from x in s1.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
            select new { s = x.Split('=') }).ToDictionary(x => x[0], x => x[1]);
9
erikkallen

あなたが試すことができます

string sx = "(colorIndex=3)(font.family=Helvetica)(font.bold=1)";

var keyValuePairs = sx.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(v => v.Split('='))
            .ToDictionary(v => v.First(), v => v.Last());
3
androschuk.a

多くの場合、httpクエリ分割に使用されます。

Usage: Dictionary<string, string> dict = stringToDictionary("userid=abc&password=xyz&retain=false");

public static Dictionary<string, string> stringToDictionary(string line, char stringSplit = '&', char keyValueSplit = '=')
{
    return line.Split(new[] { stringSplit }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Split(new[] { keyValueSplit })).ToDictionary(x => x[0], y => y[1]); ;
}
2
BSalita

正規表現でこれを行うことができます:

string sx = "(colorIndex=3)(font.family=Helvetica)(font.bold=1)";

Dictionary<string,string> dic = new Dictionary<string,string>();

Regex re = new Regex(@"\(([^=]+)=([^=]+)\)");

foreach(Match m in re.Matches(sx))
{
    dic.Add(m.Groups[1].Value, m.Groups[2].Value);
}

// extract values, to prove correctness of function
foreach(var s in dic)
    Console.WriteLine("{0}={1}", s.Key, s.Value);
2
Sune Rievers

私はこれを参照のためにここに置いています...

ASP.netの場合、クライアント側から文字列を解析して辞書に入れたい場合、これは便利です...

次のように、クライアント側でJSON文字列を作成します。

var args = "{'A':'1','B':'2','C':'" + varForC + "'}";

またはこのように:

var args = JSON.stringify(new { 'A':1, 'B':2, 'C':varForC});

またはこのようにさえ:

var obj = {};
obj.A = 1;
obj.B = 2;
obj.C = varForC;
var args = JSON.stringify(obj);

サーバーに渡します...

次に、次のようにサーバー側で解析します。

 JavaScriptSerializer jss = new JavaScriptSerializer();
 Dictionary<String, String> dict = jss.Deserialize<Dictionary<String, String>>(args);

JavaScriptSerializerにはSystem.Web.Script.Serializationが必要です。

0
Soenhay