我正在上课.
class Item{
public int Id { get; set; }
public DateTime CreatedDate { get; set; }
public string Name { get; set; }
public string Description { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我想根据动态列名过滤项目列表.假设我想要Names列表,那么Column Name是"Name",结果将是名称列表如果列名是Description,我需要描述列表.
如何使用LinQ执行此操作?
Abb*_*bas 14
简单,只需从列表中选择您需要的属性:
var items = new List<Item>();
//get names
var names = items.Select(x => x.Name);
//get descriptions
var descriptions = items.Select(x => x.Description);
Run Code Online (Sandbox Code Playgroud)
更新:
你需要做一些反思才能做到这一点:
var names = items.Select(x => x.GetType().GetProperty("Name").GetValue(x));
Run Code Online (Sandbox Code Playgroud)
把它放在一个可重用的方法中:
public IEnumerable<object> GetColumn(List<Item> items, string columnName)
{
var values = items.Select(x => x.GetType().GetProperty(columnName).GetValue(x));
return values;
}
Run Code Online (Sandbox Code Playgroud)
当然,这不会验证列中是否存在列.所以NullReferenceException当它没有的时候会扔掉它.它返回一个IEnumerable<object>,所以你必须ToString()在之后调用每个对象来获取值,或者ToString()在之后调用查询GetValue(x):
public IEnumerable<string> GetColumn(List<Item> items, string columnName)
{
var values = items.Select(x => x.GetType().GetProperty(columnName).GetValue(x).ToString());
return values;
}
Run Code Online (Sandbox Code Playgroud)
用法:
var items = new List<Item>(); //fill it up
var result = GetColumn(items, "Name");
Run Code Online (Sandbox Code Playgroud)