2011-06-22 67 views
7
Foo().OrderBy(x=> x.Name) 

如果我想按照這種方式對集合進行排序,但是隻有一個id ==(例如314)的元素應該總是在開頭,而不管它的名稱如何。Linq - 高級.OrderBy

回答

21

您可以在兩輪對其進行排序:

Foo().OrderBy(x => x.Id == 314 ? 0 : 1).ThenBy(x => x.Name) 

也許這是更簡單

Foo().OrderBy(x => x.Id != 314).ThenBy(x => x.Name) 
+1

布爾假排序。 ILSpy顯示,如果值相等,則Boolean.CompareTo'返回0;如果this'爲假則返回-1,否則返回1. – user7116

+0

好知道!謝謝。 – jishi

3

個人而言,我想這事後處理的(假設布爾值false之前邏輯真留着)客戶端,但如果你想要一個LINQ方式,那麼我可能會避免Concat - 這將是一個更復雜的查詢。我會去:

int id = 314; 
var data = Foo().OrderBy(x => x.Id == id ? 0 : 1).ThenBy(x => x.Name) 
1

嘗試使用Union:以前真

var foo = Foo(); 
foo.Where(x => x.id == 314).Union(foo.OrderBy(x => x.Name)); 
+0

根據MSDN(參見上面的鏈接),這是一個比涉及'Concat'的更好的解決方案,因爲'Concat'允許重複。 –

+0

'Single'返回一個單一的對象 - 你不能調用'Union'。 –

+0

這會調用Foo()兩次,這並不總是一個好主意。 – jishi