3

ここで広範な検索を行った後、まだ専門家のアドバイスが必要です。

要件

要件は非常に標準的です。int const をリソース ファイルの文字列にマップして、ローカリゼーションが正常に機能するようにし、現在のユーザー言語でドロップダウン リストの値のペアのリストを簡単に作成したり、int 値を後方参照したりできるようにします。const 整数は、さまざまなクラスで static として定義されています。

それで、これが現在どのように実装されているかであり、何かが私にそれがより良くなる可能性があり、批評に値することを教えてくれます:

辞書クラス:

public class TLiteralDic : Dictionary<int, string>
{
    //Lookup method
    public string getLiteral(int key)
    {
        if (ContainsKey(key)) {
            return this[key];
        }
        return string.Empty;
    }
}

UI レイヤーに近い場所で、ドロップダウン コントロールを埋めるための拡張メソッドが次のように定義されます。

public static void fill(this TLiteralDic dic, DropDownList ddlst)
{
   ddlst.Items.Clear();
   foreach (KeyValuePair<int, string> v in dic) {
      ddlst.Items.Add(new ListItem(v.Value, v.Key.ToString()));
   }
}

ペアの追加 (静的な const int からリソース ファイルの文字列へ):

public static class TLiterals
{

private static TLiteralDic _fileStatus;
public static TLiteralDic FileStatus
{
    get
    {
        if (_fileStatus == null) {
            _fileStatus = new TLiteralDic() {
                {TFiles.Status.Cancelled,   Lists.FileStatus_Cancelled},
                {TFiles.Status.Closed,      Lists.FileStatus_Closed},
                {TFiles.Status.OnHold,      Lists.FileStatus_OnHold},
                {TFiles.Status.Open,        Lists.FileStatus_Open},
                {TFiles.Status.Pending,     Lists.FileStatus_Pending},
                {TFiles.Status.Portal,      Lists.FileStatus_Portal}
            };
        }
        return _fileStatus;
    }
}

//... hundred of lists like that, short and long (up to 15 entries)

}

コードでの使用

調べる:

textStatus.Text = TLiterals.FileStatus.getLiteral(row.FileStatus);

リストの塗りつぶし:

TLiterals.FileStatus.fill(ddlstFileStatus);

考慮事項

アイデアは、マッピングが定義されている場所を 1 つだけ持ち、そこからリストを作成したり、int 値でルックアップを実行したりできるようにすることです。理想的には、優れたパフォーマンス、最小限のメモリ フットプリント、およびコーディングの手間が必要です。

すでに次の代替案を検討しています。

  • スイッチの使用 (過去にルックアップに使用されていました - 多くの冗長なコード)
  • リフレクションの使用
  • 閉鎖
  • JSON、XML
  • VS2010 で T4 クラス生成を使用する

これまでのところ、単純な、または明らかに優れた解決策は見つかりませんでした。

現在の実装の問題

  • ペアの実際のリストに関する多くの反復コード。理想的には、すべて非表示にして再利用する必要があります
  • 静的プライベート プロパティを定義する必要があります。アイデアは、リストが初めて取得されたときにのみ、リストの「遅延」初期化を使用することでした。
  • 最初の使用後にリテラルをメモリに保持することは、そのような単純な操作には高すぎるかもしれません

現在の実装の利点

  • 1 か所で定義されたリスト (同じ値のペアを使用して 2 つの異なる場所でスイッチ ルックアップと手動リスト作成を行うのとは対照的)
  • ルックアップとリストの入力に再利用されたコード。
  • 時間チェックを維持およびコンパイルするための単純さ。

より良い「美しいコード」のアイデアはありますか? :)

理想的には、リストを定義するときに次のようなものを見たいと思っていますが、実際に必要/使用されるまで初期化しないでください。

public static TLiteralDic FileStatus = new TLiteralDic () {
                {TFiles.Status.Cancelled,   Lists.FileStatus_Cancelled},
                {TFiles.Status.Closed,      Lists.FileStatus_Closed},
                {TFiles.Status.OnHold,      Lists.FileStatus_OnHold},
                {TFiles.Status.Open,        Lists.FileStatus_Open},
                {TFiles.Status.Pending,     Lists.FileStatus_Pending},
                {TFiles.Status.Portal,      Lists.FileStatus_Portal}
}
4

1 に答える 1

0

本当に必要/使用されるまで初期化しないでください。

これを行うには、遅延インスタンス化を使用できます。

Lazy<Dictionary<string, string>> resources = new Lazy<Dictionary<string, string>>(() => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase));

辞書を並べ替えると、たとえば BinarySearch を使用して検索を高速化することもできます。

于 2013-06-18T17:34:06.630 に答える