Преобразовать строку с разделителями в словарьв C # - PullRequest
33 голосов
/ 10 ноября 2010

У меня есть строка формата "Key1 = value1; key2 = значение2; ключ3 = value3;"

Мне нужно преобразовать его в словарь для вышеупомянутых пар ключ-значение.

Как лучше всего это сделать? Спасибо.

Ответы [ 5 ]

80 голосов
/ 10 ноября 2010

Как то так?

var dict = text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries)
               .Select(part => part.Split('='))
               .ToDictionary(split => split[0], split => split[1]);

Конечно, это потерпит неудачу, если предположения не будут выполнены. Например, IndexOutOfRangeException может быть выброшено, если текст не в правильном формате, и ArgumentException будет выброшено, если есть дубликаты ключей. Каждый из этих сценариев потребует различных модификаций. Если может присутствовать избыточный пробел, вам может потребоваться несколько вызовов string.Trim по мере необходимости.

16 голосов
/ 10 ноября 2010

Обновлено Ани, чтобы учесть точку с запятой в конце.Предложение 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]);
9 голосов
/ 10 апреля 2016

Вы можете сделать это, используя строку JSON, например:

var dic = JsonConvert.DeserializeObject<Dictionary<int, string>>("{'1':'One','2':'Two','3':'Three'}");
9 голосов
/ 10 ноября 2010

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

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

А если серьезно, Ани заслуживает поддержки для .ToDictionary (). Я бы никогда не подумал об этом.

6 голосов
/ 10 ноября 2010

Вы можете написать это так или зациклить, чтобы сделать это самостоятельно.В любом случае.В конечном итоге вы разделяете на ;, чтобы получить пары предметов, а затем на =, чтобы получить ключ и значение.

string input = "key1=value1;key2=value2;key3=value3;";
Dictionary<string, string> dictionary =
    input.TrimEnd(';').Split(';').ToDictionary(item => item.Split('=')[0], item => item.Split('=')[1]);

Loop версия:

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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...