4

可能重复:
LINQ:orderby 与动态字符串参数

我正在使用 OrderBy() 子句对 IEnumarable 进行排序。我有一个字符串列表,其值包含我想要排序的字段。现在我为每个属性名称使用一个 switch 语句。

  swich (propertyname)
    case "name":
      list = list.OrderBy(l=>l.name).ToList();
      break;
    case "property":
      list = list.OrderBy(l=>l.property).ToList();
      .....

有没有简单的解决方案在 orderby 子句中使用字符串“propertyname”作为属性?

正如我所做的那样,我得到了一个远非理想的解决方案。不仅对每个属性进行编码需要更多的工作,而且如果将来添加任何属性,此更新将在我正在编写的函数中被遗忘。

希望有人有更好的解决方案。

4

2 回答 2

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

使用属性信息对象,您可以获得对象 x 的值,参数为空。在这种情况下,参数将用于索引器,因为这是一个属性信息对象。

但是由于本例中的属性都是简单的属性,所以第二个参数应该是 null 或者是一个空的对象数组。

于 2012-05-02T11:38:54.020 回答
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();
于 2012-05-02T11:40:56.033 回答