【问题标题】:Extension Method to Sort a List within a parent object在父对象中对列表进行排序的扩展方法
【发布时间】:2009-04-29 15:03:16
【问题描述】:
public class Person
{
    public string name { get; set; }
    public Email email { get; set; }

}

public class Email
{
    public string desc { get; set; }
}

public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression, bool desc)
{            
    var param = Expression.Parameter(typeof(T), string.Empty);
    try
    {
        var property   = Expression.Property(param, sortExpression);
        var sortLambda = Expression.Lambda<Func<T, object>>(Expression.Convert(property, typeof(object)), param);

        if (desc)
        {
            return source.AsQueryable<T>().OrderByDescending<T, object>(sortLambda);
        }

        return source.AsQueryable<T>().OrderBy<T, object>(sortLambda);
    }
    catch (ArgumentException)
    {
        return source;
    }
}

        List<Person> vet = new List<Person>();

        Person p = new Person { name = "aaa", email = new Email { desc = "bbb@aaa.com" } };
        Person pp = new Person { name = "bbb", email = new Email { desc = "aaa@aaa.com" } };
        vet.Add(p);
        vet.Add(pp);

        vet.Sort("name",true); //works
        vet.Sort("email.desc",true) // doesnt work

有人可以帮助我吗?

【问题讨论】:

    标签: c# list sorting


    【解决方案1】:

    您可能需要考虑另一种方法,该方法采用自定义的 Comparer 对象进行比较。然后,您可以为 Person 编写一个自定义的比较器,根据他们的电子邮件地址进行比较。

    【讨论】:

      【解决方案2】:

      如果您想要此功能,请查看 ScottGu 在Dynamic Linq Library 上的一篇文章。我相信它会做你想要的。

      虽然 Lambda 是类型安全的,但有时您可能希望动态生成查询,而不是拥有用户可以排序的所有可能组合。

      编辑

      我修正了你的方法。基本上你需要为每个成员访问创建一个表达式。

       public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, string sortExpression, bool desc)
          {
              var param = Expression.Parameter(typeof(T), string.Empty);
              try
              {
                  var fields = sortExpression.Split('.');
                  Expression property = null;
                  Expression parentParam = param;
                  foreach (var field in fields)
                  {
                      property = Expression.Property(parentParam, field);
                      parentParam = property;
      
                  }
      
                  var sortLambda = 
                      Expression.Lambda<Func<T, object>>(
                        Expression.Convert(property, typeof(object)), param);
      
                  if (desc)
                  {
                      return source.AsQueryable<T>().
                           OrderByDescending<T, object>(sortLambda);
                  }
      
                  return source.AsQueryable<T>().
                       OrderBy<T, object>(sortLambda);
              }
              catch (ArgumentException)
              {
                  throw;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2014-10-04
        • 2014-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多