我有一个格式的字符串 “键1 =值;键2 =值; KEY3 =值3;”
我需要将其转换为上述键值对的字典。
最好的方法是什么? 感谢。
答案 0 :(得分:78)
这样的东西?
var dict = text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries)
.Select(part => part.Split('='))
.ToDictionary(split => split[0], split => split[1]);
当然,如果不符合这些假设,这将失败。例如,如果文本格式不正确,则可能会抛出IndexOutOfRangeException
,如果有重复的密钥,则会抛出ArgumentException
。这些场景中的每一个都需要不同的修改。如果可能存在冗余空白区域,则可能需要进行一些string.Trim
次调用。
答案 1 :(得分:15)
更新了Ani,以考虑最后的半冒号。 where子句将确保在创建和输入之前有一个键和值。
var dictionary = "key1=value1;key2=value2;key3=value3;"
.Split(';')
.Select (part => part.Split('='))
.Where (part => part.Length == 2)
.ToDictionary (sp => sp[0], sp => sp[1]);
答案 2 :(得分:9)
看到令人敬畏的空白忽略,纠正具有或不具有正则表达式的分号能力的最后值:
var dict = Regex.Matches("key1 = value1; key2 = value2 ; key3 = value3", @"\s*(.*?)\s*=\s*(.*?)\s*(;|$)")
.OfType<Match>()
.ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);
但严重的是,Ani值得.ToDictionary()的道具。我永远不会想到这一点。
答案 3 :(得分:8)
您可以使用JSON字符串执行此操作,例如:
var dic = JsonConvert.DeserializeObject<Dictionary<int, string>>("{'1':'One','2':'Two','3':'Three'}");
答案 4 :(得分:6)
你可以像这样写它或循环它自己做。无论哪种方式。最后,您要在;
分割以获取项目对,然后在=
分割以获取密钥和值。
string input = "key1=value1;key2=value2;key3=value3;";
Dictionary<string, string> dictionary =
input.TrimEnd(';').Split(';').ToDictionary(item => item.Split('=')[0], item => item.Split('=')[1]);
循环版本:
Dictionary<string, string> dictionary = new Dictionary<string, string>();
string[] items = input.TrimEnd(';').Split(';');
foreach (string item in items)
{
string[] keyValue = item.Split('=');
dictionary.Add(keyValue[0], keyValue[1]);
}