Как разбить строку в словарь - PullRequest
34 голосов
/ 05 декабря 2009

У меня есть эта строка

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

Ответы [ 9 ]

71 голосов
/ 05 декабря 2009

Это можно сделать с помощью LINQ ToDictionary () метод расширения:

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]);

РЕДАКТИРОВАТЬ : тот же результат может быть достигнут без двойного разделения:

Dictionary<string, string> dictionary =
           t.Select(item => item.Split('=')).ToDictionary(s => s[0], s => s[1]);
20 голосов
/ 05 декабря 2009

Могут быть более эффективные способы, но это должно работать:

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]);
}
19 голосов
/ 05 декабря 2009

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

Вы знаете, что хотите сохранить:

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);
13 голосов
/ 05 декабря 2009
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]);
9 голосов
/ 05 декабря 2009
var dict = (from x in s1.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
            select new { s = x.Split('=') }).ToDictionary(x => x[0], x => x[1]);
3 голосов
/ 12 ноября 2015

Вы можете попробовать

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());
2 голосов
/ 23 декабря 2016

Часто используется для разделения 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 голосов
/ 05 декабря 2009

Вы можете сделать это с помощью регулярных выражений:

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);
0 голосов
/ 23 мая 2013

Я просто помещаю это здесь для справки ...

Для 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);

passэто на сервер ...

, затем проанализируйте его на стороне сервера следующим образом:

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

JavaScriptSerializer требует System.Web.Script.Serialization.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...