从关联数组 c# 中检索值

Retrieving value out of Associative array c#

我陷入了下一个问题。

我从包含以下内容的文本文件中读取了一行:

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

在 Lisp 中,这是一个列表,用于在 Lisp 中检索例如 ITEM 的值:

(cadr (assoc "ITEM" str))

这给出 05

如何在 C# 中简单地实现这一点?

您可以使用 Regex 来解析值,然后获取结果。例如,

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

这将为您提供如下合集

您现在可以使用 Linq 获取键等于 "ITEM" 的值。

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>.*?(?=""))""\)"

另一种方法是使用 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());

输出