2011-09-06 2 views
5

私は順序を定義するFuncのリストを持っていますリストが任意の数の連続した順序を含むことができるときに、上記を行う方法を理解しようとする。出来ますか?LINQのは

答えて

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; 
} 
+0

は、あなたが実際のカウントをチェックする必要はありません

// Requires a non-empty ordering sequence. var result2 = ordering.Skip(1) .Aggregate(people.OrderBy(ordering.First()), Enumerable.ThenBy); 

(または):あなたが希望する場合

は、あなたもAggregate演算子を使用することができますループで行われました – msarchet

+0

私は "同じです"というビットが何らかの理由で真実であったことに気づいていませんでした。私は彼らが直接従わなければならないと思った。どうもありがとう。 – fearofawhackplanet

+0

hmmmm ...実際には同じではありません。 'ThenBy'は' OrderedEnumerable 'で動作します。これは私がどのように覚えているかです。私はそれを回避することができると思う。 – fearofawhackplanet

3

あなたはこの

に似た何かを行うことができるはず
people = people.OrderBy(ordering[0]) 
foreach(var order in ordering.Skip(1)) 
{ 
    people = people.ThenBy(order); 
} 

al恒等的

for(i = 0; i < ordering.Count; i++) 
{ 
    people = i == 0 ? people.OrderBy(ordering[i]) : people.ThenBy(ordering[i]); 
} 
2

LINQ実行が延期されていることに注意してください。あなたのような何かをして、結果にアクセスする前に表現を順次構築することができます。

var ordered = unordered.OrderBy(ordering.First()); 
foreach (var orderingItem in ordering.Skip(1)) 
{ 
    ordered = ordered.ThenBy(orderingItem); 
} 
4

他の人が述べたように、あなたがこれを行うためにループを使用することができます。あなただけのこと何切り替えた場合、

// 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); 
+1

私はこれらの簡潔さが好きです、ありがとう – fearofawhackplanet