0

我正在寻找现有的解决方案或创建一个解决方案来解决基于枚举位掩码查找项目的问题。本质上,我有一个带有标志属性集的枚举,因此我可以将这些值组合成一个位掩码。我想做的是为每个单独的值设置一个存储桶,并在掩码中启用标志的每个存储桶中放入一个条目。

字典的值部分将用作一种包含条目的列表。理想情况下,代码用法类似于以下内容:

Enum Fields { Unknown = 0, Username = 1 << 0, Password = 1 << 1, Email 1 << 2...etc }
Dictionary<Fields, List<string>> errors = new Dictionary<Fields, List<string>>();
Fields mask = Fields.UserName | Fields.Password;
errors[mask] = "Input is empty";
List<string> errMsgs = errors[Fields.UserName]; 
// to get a list of all error messages associated with Fields.UserName
// including the one just entered.  A lookup on Fields.Password would 
// return the same entry

我已经知道如何使用带有 value 元素作为列表的 Dictionary 来完成此操作。我关心的是当我创建数千个对象时的效率,每个对象都有自己的错误查找机制实例。我不希望这个错误字典的每个实例都有数百个条目,因为每个对象只有 N 个字段,并且只有有限数量的位掩码,因此我考虑只使用列表或键控设置,转换为列表并对其运行 LINQ 以查找不同的 Enum 条目桶。

编辑:我希望错误在内存中看起来像这样

UserName: [001]=[{011,"Input is empty"},{001,"Username must be 8 letters long"]}
Password: [010]=[{011,"Input is empty",{010,"Password must be 8 letters long, and contain UCase, and digits"}]
Email:    [100]=[{100,"Email address malformed."}]

因此,当 UI 询问 Errors 是否 Fields.Password 有任何错误时,它会报告两个,并且 UI 可以在该字段上显示一个指示符,并报告相应的错误。具有列表值的字典在很大程度上可以解决这个问题,但我担心它在内存中的效率如何,并且想知道整个对象的单个列表是否可能不会更好。IE List() 其中 Errors 包含一个位掩码和一个 ErrMsg 字符串,让 Linq 对其进行排序。

4

0 回答 0