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

Koleksiyonun bu şekilde sıralanmasını istiyorum, ancak tam olarak == ile ifade edilen bir öğenin (= 314), adından bağımsız olarak her zaman başlangıçta olması gerekir.Linq - advanced .OrderBy

cevap

21

İki mermi üzerinde sıralayabilirsiniz:

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

Belki bu daha basittir

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

false türlü gerçek evvel. ILSpy, "Boolean.CompareTo" değerlerinin eşit olması durumunda 0 değerini döndürdüğünü, aksi takdirde -1 değerini döndürdüğünü gösterir. – user7116

+0

Bilmek güzel! teşekkür ederim. – jishi

3

Şahsen ben o sonradan halledeceğini (false boolean true boolean önce sported olduğu varsayılarak) İstemci, ancak LINQ yolunu tercih ederseniz, muhtemelen Concat'dan kaçınırım - daha karmaşık bir sorgu olacaktır. Ben gitmek istiyorum:

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

Union kullanarak deneyin:

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

MSDN'ye göre (yukarıdaki bağlantıya bakın), Concat'ın çoğalmasına izin verdiği için bu, Concat'la ilgili her şeyden daha iyi bir çözümdür. –

+0

'Single' tek bir nesneyi döndürür - bu konuda Sendika'yı arayamazsınız. –

+0

Bu, Foo() 'yı her zaman harika bir fikir olmayan iki kere çağırırdı. – jishi