У меня есть строка формата "Ключ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'}");