我想从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;所以现在我想根据模板选择列。
答案 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)
以下是解决方案: Select a Column Dynamically using LINQ? 看看Dynamic Linq:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
答案 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);
您只需要做一些代码来决定应该使用哪个模板。
我希望这会有所帮助!!