排序/订购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();
}
我不确定我是否看到了你所说的"动态"的好处。
如何使用泛型和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的一个示例。