6

次のように動的に列を選択したいList。では、最善の方法は何でしょうか?

//a objects list
List<DashBoard> dashboardlist = (List<DashBoard>)objList;  
string strColumns = "RecDate,ModifiedDate";
objList = (from obj in dashboardlist select new { strColumns }).ToList();

/////////////わかりました、オブジェクトリストを忘れてください。列ID、名前、年齢、性別などの番号を持つデータベーステーブルがあると言ってください。次に、表示するcolumnListがあり、columnListは条件に応じて変更します。だから私はリストの人々を持っています。およびListcolumnTemplate; そこで、テンプレートに基づいて列を選択したいと思います。

4

4 に答える 4

7

私の質問にアイデアを提供してくれてありがとう。グーグルで数時間を過ごして、私は解決策を見つけました。

public void Test() {
    var data = new[] {
        new TestData { X = 1, Y = 2, Z = 3 }
    ,   new TestData { X = 2, Y = 4, Z = 6 }
    };
    var strColumns = "X,Z".Split(',');
    foreach (var item in data.Select(a => Projection(a, strColumns))) {
        Console.WriteLine("{0} {1}", item.X, item.Z);
    }
}
private static dynamic Projection(object a, IEnumerable<string> props) {
    if (a == null) {
        return null;
    }
    IDictionary<string,object> res = new ExpandoObject();
    var type = a.GetType();
    foreach (var pair in props.Select(n => new {
        Name = n
    ,   Property = type.GetProperty(n)})) {
        res[pair.Name] = pair.Property.GetValue(a, new object[0]);
    }
    return res;
}
class TestData {
    public int X { get; set; }
    public int Y { get; set; }
    public int Z { get; set; }
}
于 2012-11-23T05:55:15.583 に答える
1

列のリストは外部リソースからのものであり、変更される可能性があると思います。提案します。

リフレクションを使用すると、各列に対応するFieldInfoのリストを作成し、リストの各項目と各FieldInfoをループして、データオブジェクトでGetValueを呼び出すことができます。

于 2012-11-22T12:34:14.020 に答える
0

解決策は次のとおり です。LINQを使用して動的に列を選択しますか? Dynamic Linqを見てください:http ://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

于 2012-11-22T12:42:35.970 に答える
0

テンプレートが2つしかない場合を考えてみましょう。テンプレートごとに、必要な列のみを返すメソッドを作成できます。このようなもの:

// method for template 1 - returns only 3 columns/properties
private DashBoard CreateDashBoardXxxxxxx(DashBoard item)
{
    return new DashBoard {
        Property1 = item.Property1,
        Property4 = item.Property2,
        Property3 = item.Property3
    };
}

// method for template 2 - returns N columns/properties
private DashBoard CreateDashBoardYyyyyyyy(DashBoard item)
{
    return new DashBoard {
        Property1 = item.Property1,
        Property4 = item.Property2,

        // Other properties
        // .....

        PropertyN = item.PropertyN
    };
}

次に、次のようなメソッドを使用できます。

List<DashBoard> dashboardlist = (List<DashBoard>)objList; 

// using template 1
var list = dashboardlist.Select(CreateDashBoardXxxxxxx);

// using template 2
var list2 = dashboardlist.Select(CreateDashBoardYyyyyyyy);

使用するテンプレートを決定するには、いくつかのコードを実行する必要があります。

これがお役に立てば幸いです!!

于 2012-11-22T13:59:41.070 に答える