我有这个字符串
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
答案 0 :(得分:70)
可以使用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]);
答案 1 :(得分:19)
可能有更有效的方法,但这应该有效:
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]);
}
答案 2 :(得分:19)
Randal Schwartz有一个rule of thumb:当你知道要丢弃什么时使用拆分,或者当你知道要保留什么时使用正则表达式。
你知道你想要保留什么:
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);
答案 3 :(得分:13)
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]);
答案 4 :(得分:9)
var dict = (from x in s1.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
select new { s = x.Split('=') }).ToDictionary(x => x[0], x => x[1]);
答案 5 :(得分:3)
You can try
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());
答案 6 :(得分:2)
您可以使用正则表达式执行此操作:
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);
答案 7 :(得分:2)
经常用于http查询拆分。
border-top
答案 8 :(得分:0)
我只是把它放在这里供参考......
对于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。