2011-06-22 68 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