1

私は2つのリストを持っています.1つはフィルタリング可能な列(DropDown型)の名前を保存し、もう1つはそれらのフィルタリング可能な列にロードする値を保存します.

 List<string> filterableFields = new List<string>() { "A_B", "C_D", "E_F" };
 List<string> AB, CD , EF;

実行時に Web サービスからデータを取得し、これらのフィルター可能なフィールドの値を抽出して 2 番目のリストに値を保存する関数を作成しました。

private void prepareListForFilterableColumns(XDocument records)
{
    foreach (var currentField in filterableFields)
    {
        var values = (from xml in records.Descendants(z + "row")
                      let val = (string)xml.Attribute("ows_" + currentField.Replace("_", "_x0020_"))
                      where val != ""
                      orderby val
                      select val 
                     ).Distinct();

        switch (currentField)
        {
            case "A_B": AB = values.ToList(); break;
            case "C_D": CD = values.ToList(); break;
        }
    }
}

今私は、割り当てをswtich caseブロックでハードコーディングする代わりに、最初のリスト名「A_B」を使用し、それから「_」を置き換えて2番目のリストを指し、それに割り当てることができればと考えvalues.ToList()ていました。

c# は静的言語であることを理解しています。これを達成できるかどうかはわかりませんが、できれば関数をジェネリックにすることができます。

時間と助けを前もってありがとう。

ヴィシャール

4

1 に答える 1

2

値を格納するために、3つのリストの代わりに文字列のリストのディクショナリを使用できます。

Dictionary<string, List<string>> val lists = new Dictionary<string,List<string>>();

そして、辞書のキーをフィルター可能なものと等しくします: "AB"、 "CD"、..

次に、代わりに文字列キーに基づいてリーチリストをAB使用して参照できます。valLists["AB"]

もう1つのオプションはリフレクションを使用することですが、それは遅くなり、不必要に少し複雑になります。

于 2013-03-15T14:12:02.680 に答える