У меня есть строка формата "Ключ1 = значение1; ключ2 = значение2; ключ3 = значение3;"
Мне нужно преобразовать его в словарь для вышеупомянутых пар значений ключа.
Каким будет лучший способ? Спасибо.
У меня есть строка формата "Ключ1 = значение1; ключ2 = значение2; ключ3 = значение3;"
Мне нужно преобразовать его в словарь для вышеупомянутых пар значений ключа.
Каким будет лучший способ? Спасибо.
Что-то вроде этого?
var dict = text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries)
.Select(part => part.Split('='))
.ToDictionary(split => split[0], split => split[1]);
Конечно, это не сработает, если предположения не будут выполнены. Например, можно было бы выбросить IndexOutOfRangeException, если текст не в правильном формате, а ArgumentException будет выбрано, если есть дубликаты ключей. Каждый из этих сценариев потребует различных модификаций. Если избыточное пустое пространство может присутствовать, вам могут потребоваться некоторые вызовы string.Trim, если необходимо.
Обновлен 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]);
Посмотрите на удивительный пробел, игнорируя, исправляя последнее значение, имеющее или не обладающее степенью точности с запятой регулярных выражений:
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(). Я бы никогда не подумал об этом.
Вы могли бы написать это так или сделать цикл, чтобы сделать это самостоятельно. Так или иначе. В конечном счете, вы разбиваете на ;, чтобы получить пар элементов, а затем =, чтобы получить ключ и значение.
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 version:
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]);
}
Вы можете сделать это, используя строку JSON, например:
var dic = JsonConvert.DeserializeObject<Dictionary<int, string>>("{'1':'One','2':'Two','3':'Three'}");