【发布时间】:2021-01-22 11:46:36
【问题描述】:
我正在处理一个需要加载 JSON 配置文件、使用 Newtonsoft.JSON 解析并提取值的项目。一些 key-value-paris 必须映射到 Enum,结果应该是 Dictionary<string, enumType>。这些枚举之一是System.Drawing.RotateFlipType。但是因为这个枚举有 16 个成员,其中 8 个成员与另一个成员共享基础值,ToDictionary 方法会抛出一个 System.ArgumentException,因为“已经有一个元素具有相同的键”。
目前我正在使用以下代码:
var rotationTypesDict = Enum
.GetValues(typeof(RotateFlipType))
.Cast<RotateFlipType>()
.ToDictionary(x => x.ToString(), x => x);
这里的问题是 Linq 查询的返回类型:Dictionary<string, RotateFlipType>。由于 ToString() 应用于 RotationFlipType 且基础值为 0,因此仅解析“RotateNoneFlipNone”,即使“Rotate180FlipXY”也具有基础值“0”。所以我想知道有没有机会完成这项工作。
我还尝试了另一种方式来使用Enum.GetNames() 和ToDictionary() ToDictionary 元节点将键作为字符串返回(如预期的那样),但值与以前存在相同的问题。当使用字符串“RotateNoneFlipNone”来查找基础值时,它得到的值是 0,这让我得到了 RotationFlipType.RotateNoneFlipNone 成员。完美的!但是当使用字符串“Rotate180FlipXY”时,基础值也是“0”,这给了我成员RotationFlipType.RotateNoneFlipNone,在这种情况下是错误的。 (错误,因为如果在配置文件中用户想要使用 RotationFlipType "Rotate180FlipXY" 那么程序在字典中搜索这个值并没有找到它。)
编辑:按照 JonasH 的要求,我尝试解释我想要什么。
目标是获取 DictionarySelectedItem.ToString() 来检索的,因此如果我选择 RotationFlipType“Rotate180FlipXY”,它在技术上与 RotationFlipType“RotateNoneFlipNone”相同,但配置文件将包含“Rotate180FlipXY”。所以在读取和解析config 文件并查找“Rotate180FlipXY”不会有任何结果,因为当我只包含具有唯一基础值的条目时,成员“RotateNoneFlipNone”和“Rotate180FlipXY”将被压缩为“RotateNoneFlipNone”。对于单线
【问题讨论】:
-
你将它们分组并返回
Dictionary<string, IList<RotateFlipType>> -
我不太清楚这里的实际目标是什么。如果
RotateNoneFlipNone与Rotate180FlipXY具有相同的值,则它们是相同的。如果你不希望它们是同一个东西,它们应该有不同的值。
标签: c# dictionary enums