我有一个Func
定义排序的列表:
var ordering = new List<Func<Person, IComparable>>
{ x => x.Surname, x => x.FirstName };
我可以用类似的东西订购结果...
people = people.OrderBy(ordering[0]).ThenBy(ordering[1]);
我试图弄清楚当列表可以包含任意数量的顺序时如何执行上述操作。可能吗?
我有一个Func
定义排序的列表:
var ordering = new List<Func<Person, IComparable>>
{ x => x.Surname, x => x.FirstName };
我可以用类似的东西订购结果...
people = people.OrderBy(ordering[0]).ThenBy(ordering[1]);
我试图弄清楚当列表可以包含任意数量的顺序时如何执行上述操作。可能吗?
people = people.OrderBy(ordering[0]).ThenBy(ordering[1]).ThenBy(ordering[2]);
是相同的
var orderedPeople = people.OrderBy(ordering[0]);
orderedPeople = orderedPeople.ThenBy(ordering[1]);
orderedPeople = orderedPeople.ThenBy(ordering[2]);
people = orderedPeople;
所以你只需写一个这样的循环:
if (ordering.Count != 0)
{
var orderedPeople = people.OrderBy(ordering[0]);
for (int i = 1; i < ordering.Count; i++)
{
orderedPeople = orderedPeople.ThenBy(ordering[i]);
}
people = orderedPeople;
}
正如其他人所提到的,您可以使用循环来执行此操作。
如果您愿意,还可以使用Aggregate
运算符:
// Requires a non-empty ordering sequence.
var result2 = ordering.Skip(1)
.Aggregate(people.OrderBy(ordering.First()), Enumerable.ThenBy);
(或者)
// Shorter and more "symmetric" but potentially more inefficient.
// x => true should work because OrderBy is a stable sort.
var result = ordering.Aggregate(people.OrderBy(x => true), Enumerable.ThenBy);
你应该能够做类似的事情
people = people.OrderBy(ordering[0])
foreach(var order in ordering.Skip(1))
{
people = people.ThenBy(order);
}
交替
for(i = 0; i < ordering.Count; i++)
{
people = i == 0 ? people.OrderBy(ordering[i]) : people.ThenBy(ordering[i]);
}
请记住,LINQ 执行是延迟的。您可以在访问结果之前按顺序构建表达式,执行以下操作:
var ordered = unordered.OrderBy(ordering.First());
foreach (var orderingItem in ordering.Skip(1))
{
ordered = ordered.ThenBy(orderingItem);
}
您可能希望通过动态构建您的表达来做到这一点。更多信息:动态 LINQ 和动态 Lambda 表达式?