【问题标题】:C# How to sort a list of objects by any propertyC#如何按任何属性对对象列表进行排序
【发布时间】:2018-05-25 22:01:34
【问题描述】:
public class SortExample
{
  public int IntField {get; set;}

  public string StringField {get; set;}

  public DateTime DateField {get; set;}
}

这个类被设置为列表视图的源,下面函数中传递的 sortExpression 参数是属性名称,排序顺序为 'IntField ASC' 'IntField DESC' 'StringField ASC' 'StringField DESC'

public void SortExampleMethod(string sortExpression)
{
   List<SortExample> list = new  List<SortExample>();
   list.OrderBy(sortExpression);
}

实现这一点的唯一方法是为每个属性编写一个比较器,或者 LINQ 中的某些东西可以轻松完成吗?

【问题讨论】:

  • 'IntField ASC' 'IntField DESC'?它是如何工作的?
  • 该代码甚至无法编译。
  • 您可以为任何属性动态构建表达式。
  • 我想你正在寻找类似list.OrderBy(x=&gt;x.IntField).ThenByDescending(x=&gt;x.StringField) 的东西,但你的问题太糟糕了,很难猜出你想要什么。

标签: c# linq sorting


【解决方案1】:

要满足您的需要,您可以使用 LINQ 动态查询库,它允许您将 string 传递给您的 OrderBy

例如:var result = list.OrderBy("intField asc");

这里有完整教程

https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library

另一种解决方案是让方法接受Expression

public void sort(Expression<Func<TEntity, S>> orderByExpression, bool ascending)
{

List<SortExample> list = new  List<SortExample>();
if(ascending)
{
   list.OrderBy(orderByExpression);
}
else
   list.OrderByDescneding(orderByExpression);
}

【讨论】:

  • 谢谢!我的解决方案是这个 'list.AsQueryable().OrderBy(sortExpression).ToList()'
【解决方案2】:

类似:

list.OrderBy(x => x.property);

https://msdn.microsoft.com/en-us/library/bb534966.aspx

【讨论】:

  • 天哪!努力解释他将如何有效地使用它。
  • 您好丹尼,下次您发布答案时,请给出该人可以遵循的理由和指导方针
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多