排序/订购List< object>使用组合成员和Lambda表达式

本文关键字:组合 成员 表达式 Lambda 订购 List object 排序 | 更新日期: 2023-09-27 18:11:31

我正在尝试排序具有复合成员的对象列表。虽然我可以让它为成员基本类型(Person.EmployeeName)工作,但我不知道如何为复合成员(Person.Employee.CompanyName)实现它。我正在创建一个Lambda表达式变量,并将其发送到顺序。

编辑:我应该补充:这是在GridView排序方法上调用的。我确实使用[If (e.SortExpression == "Employee.CompanyName"){…order (..Employee.CompanyName)}]但是(我的老板)建议保持这种动态。

public class Company {
    public string CompanyName;
}
public class Person {
    public Company Employee;
    public string EmployeeName;
}
public void LinqExpressionTest() {
    // Create List of people with Employeers
    List<Person> people = new List<Person>();
    people.Add(new Person() { Employee = new Company { CompanyName = "Apple" } });
    people.Add(new Person() { Employee = new Company { CompanyName = "Microsoft" } });
    // Create Linq Lambda expression for sort based on Person.Employee.CompanyName
    // Error on next line because "Employee.CompanyName" is 'not defined for type Expression.Property'
    var param = Expression.Parameter(typeof(Person), "Employee.CompanyName"); 
    Expression linqExpression = Expression.Property(param, "Employee.CompanyName");
    UnaryExpression unaryExpression = Expression.Convert(linqExpression, typeof(object));
    var sortExpression = Expression.Lambda<Func<Person, object>>(unaryExpression, param);
    var sortedPeople = people.AsQueryable<Person>().OrderBy(sortExpression).ToList();
}

排序/订购List< object>使用组合成员和Lambda表达式

我不确定我是否看到了你所说的"动态"的好处。

如何使用泛型和Func委托-似乎有点极端,虽然我不知道它是否会工作-我刚刚采取了我之前的查询,并创建了一个方法,将传递你想要排序列表的键:

    public IEnumerable<TSource> OrderList<TSource, TKey>(
        IEnumerable<TSource> list, 
        Func<TSource, TKey> sortFunction)
    {
        return from element in list
               orderby sortFunction
               select element;
    }

那么你可以这样调用它:

OrderList<Person, string>(people, (x)=>(x.Employee.CompanyName));

基本上,您只想按Employee对集合进行排序。公司名称对吗?以下操作是否有效?

var sortedList = (from person in people
                 orderby person.Employee.CompanyName
                 select person).ToList()

看一下101Linq samples中的一些示例,这是Linq order的一个示例。