Получение значения из ассоциативного массива c# - PullRequest
0 голосов
/ 07 февраля 2020

Я застрял на своей следующей проблеме.

Я читаю строку из текстового файла, содержащую:

(("ITEM" "05") ("NUMBER" "1") ("DESCRIPTION" "*RECHTE INSTEEKKOP. 1/4\"-8MM") ("ARTICLENUMBER" "S110010000104"))

В Лиспе это список и для получения значения, например, ITEM в Лиспе:

(cadr (assoc "ITEM" str))

Это дает 05

Как мне добиться этого просто в C#?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Вы можете использовать Regex, чтобы проанализировать значение и затем получить результат. Например,

var valueCollection = Regex.Matches(datastring,@"\(""(?<Key>.+?(?=""))""\s+""(?<Value>.+?(?=""))""\)")
                                 .Cast<Match>()
                                .Select(x=>new {Key = x.Groups["Key"].Value,Value = x.Groups["Value"].Value,});

Это даст вам коллекцию в виде следующего:

enter image description here

Теперь вы можете получить значение где ключ равно «ПУНКТ» с использованием Linq.

var itemValue = valueCollection.First(x=>x.Key=="ITEM").Value;

В качестве альтернативы, вы можете преобразовать строку в словарь как

var valueCollection = Regex.Matches(datastring,@"\(""(?<Key>.+?(?=""))""\s+""(?<Value>.+?(?=""))""\)")
                                 .Cast<Match>()
                                 .ToDictionary(x=>x.Groups["Key"].Value,y=>y.Groups["Value"].Value);

Теперь вы можете анализировать требуемое значение ITEM как

var itemValue = valueCollection["ITEM"];

Обновление на основе комментария

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

@"\(""(?<Key>.+?(?=""))""\s+""(?<Value>.*?(?=""))""\)"
0 голосов
/ 07 февраля 2020

Другой подход - использование Split функции

string values = "((\"ITEM\" \"05\") (\"NUMBER\" \"1\") (\"DESCRIPTION\" \" * RECHTE INSTEEKKOP. 1 / 4\" - 8MM\") (\"ARTICLENUMBER\" \"S110010000104\"))";

var keyValuePairs = values.Split(new[] { "(", ")", " (", ") " }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(s => s.Split(new[] { ' ' }, 2))
                    .ToDictionary(x => x[0].ToString(), x => x[1].ToString());

Вывод

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...