如何从列表中选择动态列

时间:2012-11-22 12:22:25

标签: c# linq

我想从List动态选择列,如下所示。那么最好的方法是什么呢?

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

///////////// 好吧,忘记对象列表说我有数据库表,其中包含列ID,名称,年龄,性别等。然后我有列表显示,列列表根据条件改变。所以我有List人;和列columnTemplate;所以现在我想根据模板选择列。

4 个答案:

答案 0 :(得分:7)

感谢您提出我的问题的想法。在几个小时内  Google我找到solution

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; }
}

答案 1 :(得分:1)

我认为列的列表可能来自外部资源并且发生了变化,我建议:

使用反射,您可以生成与每个列对应的FieldInfo列表,然后遍历列表中的每个项目以及每个FieldInfo并在数据对象上调用GetValue。

答案 2 :(得分:0)

答案 3 :(得分: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);

您只需要做一些代码来决定应该使用哪个模板。

我希望这会有所帮助!!