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および動的ラムダ式?

于 2011-09-06T16:17:23.487 に答える