5

我有一个Func定义排序的列表:

var ordering = new List<Func<Person, IComparable>> 
                 { x => x.Surname, x => x.FirstName };

我可以用类似的东西订购结果...

people = people.OrderBy(ordering[0]).ThenBy(ordering[1]);

我试图弄清楚当列表可以包含任意数量的顺序时如何执行上述操作。可能吗?

4

5 回答 5

6
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;
}
于 2011-09-06T16:18:42.833 回答
4

正如其他人所提到的,您可以使用循环来执行此操作。

如果您愿意,还可以使用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);
于 2011-09-06T16:27:00.510 回答
3

你应该能够做类似的事情

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]);
 }
于 2011-09-06T16:18:57.383 回答
2

请记住,LINQ 执行是延迟的。您可以在访问结果之前按顺序构建表达式,执行以下操作:

var ordered = unordered.OrderBy(ordering.First());
foreach (var orderingItem in ordering.Skip(1))
{
    ordered = ordered.ThenBy(orderingItem);
}
于 2011-09-06T16:21:15.330 回答
0

您可能希望通过动态构建您的表达来做到这一点。更多信息:动态 LINQ 和动态 Lambda 表达式?

于 2011-09-06T16:17:23.487 回答