0

既存のソリューションを探しているか、Enum ビットマスクに基づいてアイテムを検索する問題を解決するソリューションを作成しています。基本的に、flag プロパティが設定された Enum があるので、これらの値をビットマスクに組み合わせることができます。私がやりたいことは、個々の値ごとにバケットを用意し、マスクでフラグが有効になっている各バケットにエントリを入れることです。

ディクショナリの値の部分は、エントリを含む一種のリストとして機能します。理想的には、コードの使用法は次のようになります。

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

値要素をリストとして持つディクショナリを使用してこれを行う方法については、すでに考えています。私の懸念は、このエラー ルックアップ メカニズムの独自のインスタンスを持つ何千ものオブジェクトを作成するときの効率です。このエラー ディクショナリの各インスタンスに何百ものエントリがあるとは思いません。各オブジェクトには 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."}]

そのため、Fields.Password にエラーがあるかどうかを UI が Errors に尋ねると、2 つが報告され、UI はそのフィールドにインジケーターを表示して、対応するエラーが報告されるようにします。リスト値を持つディクショナリはこれをほとんど解決できますが、それがメモリ内でどれほど効率的であるかが心配であり、オブジェクト全体の単一のリストが良くないかどうか疑問に思っています. Errors に Bitmask と ErrMsg 文字列が含まれている IE List() で、Linq に並べ替えさせます。

4

0 に答える 0