我正在上课。
class Item{
public int Id { get; set; }
public DateTime CreatedDate { get; set; }
public string Name { get; set; }
public string Description { get; set;}
}
我想根据动态列名过滤项目列表。 假设我想要名称列表,那么列名称是“名称”,结果将是名称列表 如果列名是Description,我需要描述列表。
如何使用LinQ执行此操作?
答案 0 :(得分:13)
简单,只需从列表中选择您需要的属性:
var items = new List<Item>();
//get names
var names = items.Select(x => x.Name);
//get descriptions
var descriptions = items.Select(x => x.Description);
<强>更新强>
你需要做一些反思才能做到这一点:
var names = items.Select(x => x.GetType().GetProperty("Name").GetValue(x));
将其放入可重用性的方法中:
public IEnumerable<object> GetColumn(List<Item> items, string columnName)
{
var values = items.Select(x => x.GetType().GetProperty(columnName).GetValue(x));
return values;
}
当然,这不会验证对象中是否存在列。所以当它没有时会抛出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;
}
用法:
var items = new List<Item>(); //fill it up
var result = GetColumn(items, "Name");