【发布时间】:2011-06-22 20:17:37
【问题描述】:
Foo().OrderBy(x=> x.Name)
如果我希望以这种方式对集合进行排序,但只有一个具有 Id == 的元素(比如 314)应该始终位于开头,无论其名称如何。
【问题讨论】:
Foo().OrderBy(x=> x.Name)
如果我希望以这种方式对集合进行排序,但只有一个具有 Id == 的元素(比如 314)应该始终位于开头,无论其名称如何。
【问题讨论】:
你可以分两轮排序:
Foo().OrderBy(x => x.Id == 314 ? 0 : 1).ThenBy(x => x.Name)
也许这更简单(假设 boolean false 在 boolean true 之前运行)
Foo().OrderBy(x => x.Id != 314).ThenBy(x => x.Name)
【讨论】:
Boolean.CompareTo 如果值相等则返回 0,如果 this 为假则返回 -1,否则返回 1。
我个人会在客户端处理这个问题,但如果你想要一种 LINQ 方式,那么我可能会避免使用Concat - 这将是一个更复杂的查询。我会去:
int id = 314;
var data = Foo().OrderBy(x => x.Id == id ? 0 : 1).ThenBy(x => x.Name)
【讨论】:
尝试使用Union:
var foo = Foo();
foo.Where(x => x.id == 314).Union(foo.OrderBy(x => x.Name));
【讨论】:
Concat 的任何解决方案都更好,因为Concat 允许重复。
Single 返回一个对象 - 你不能在上面调用 Union。