我正在使用OrderBy()子句对IEnumarable进行排序。我是一个包含字符串的列表,其中包含我想要排序的字段。现在我正在为每个属性名称使用switch语句。
swich (propertyname)
case "name":
list = list.OrderBy(l=>l.name).ToList();
break;
case "property":
list = list.OrderBy(l=>l.property).ToList();
.....
是否有一个简单的解决方案,使用字符串“propertyname”作为orderby子句中的属性?
正如我所做的那样,我得到了一个远非理想的解决方案。编写每个属性不仅更有效,而且如果将来添加任何属性,这个更新将被遗忘在我正在编写的函数中。
希望有人能找到更好的解决方案。答案 0 :(得分:3)
var list = new List<MyClass>();
// Gets an object to give us access to the property with the given name of type MyClass
var propertyInfo = typeof(MyClass).GetProperty(propertyName);
// Each item is ordered by the value of the property
list = list.OrderBy(x => propertyInfo.GetValue(x, null)).ToList();
解释谓词:
var xPropVal = propertyInfo.GetValue(x, null);
使用属性info对象,可以获得对象x的值,并带有null参数。 在这种情况下,参数将用于索引器,因为这是属性信息对象。
但由于这种情况下的属性都是简单属性,因此第二个参数应为null或空对象数组。
答案 1 :(得分:1)
最简单的方法是查看Microsoft提供的Dynamic Linq示例。 Scott Guthrie在这里有一篇关于它的博客文章:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
你可以这样做:
string propertyname = ...
list.OrderBy(propertyname).ToList();