[英]LINQ - OrderByDescending
请注意:截至 2016 年 8 月 26 日 UTC 下午 1:47,我完全修改了这个问题,因为它最初非常令人困惑。 那是我的错。 因此,请在此之前忽略所有答案/评论。 谢谢
我有一个通过 SearchType 添加到 SearchItems 列表的项目列表... ObjectAType、ObjectBType 等的 SearchType。我想按 SearchType 为 ObjectAType 或 ObjectBType 的项目排序 SearchTimes。 对于所有其他 SearchType,它需要按升序排列。
这是我的查询:
var orderdItems = SearchItems.OrderBy(i => i.ItemDisplay)
.OrderBy(i => i.CategoryDisplay))
这是我想按降序排序的标准。
Where(x => x.SearchType == ObjectAType || x.SearchType == ObjectBType)
这是 SearchItem 的结构
public class SearchItem
{
public SearchItem() { }
public Guid ItemId { get; set; }
public string ItemDisplay { get; set; }
public string CategoryDisplay { get; set; }
public string SearchType { get; set; }
}
这就是它们如何添加到SearchItems = List<SearchItems>();
SearchItems.AddRange(items.Select(i => new SearchItem()
{
CategoryDisplay = "Object A",
ItemDisplay = i.ObjectADisplay,
ItemId = i.ObjectAId,
SearchType = ObjectAType,
}));
SearchItems.AddRange(items.Select(i => new SearchItem()
{
CategoryDisplay = "Object B",
ItemDisplay = i.ObjectBDisplay,
ItemId = i.ObjectBId,
SearchType = ObjectBType,
}));
等等......'items' 是IEnumerable<ObjectA>, IEnumerable<ObjectB>
等。
var desc = this.SearchItems
.Where(x => x.SearchType == Foo || x.SearchType == Bar)
.OrderByDescending(i => i.ItemDisplay)
.ThenByDescending(i => i.CategoryDisplay);
var asc = this.SearchItems
.Where(x => x.SearchType != Foo && x.SearchType != Bar)
.OrderBy(i => i.ItemDisplay)
.ThenBy(i => i.CategoryDisplay);
var result = desc.Concat(asc);
当然,您也可以将其作为一个查询来完成。
我假设您首先需要 2 个下降的对象。 如果不是这种情况,则将最后一条语句转过来。
var result = asc.Concat(desc);
如果要对列表本身进行排序,请执行此操作
this.SearchItems = desc.Concat(asc).ToList();
这个问题相当令人困惑,但如果我理解正确,您有 26 个对象,并且您想要这些对象的序列化列表,例如 Object A 是第一个,然后是 Object B,然后是属性 Z0D2251F834DF143E 排序的所有剩余对象。
如果是这样,可以通过 object 的顺序来编写,首先是 Object A。
SearchItemsJson = serializer.Serialize(
this.SearchItems
.OrderByDescending(i => i.SearchType == "Foo")
.ThenByDescending(i => i.SearchType == "Bar")
.ThenBy(i => i.ItemDisplay)
.ThenBy(i => i.CategoryDisplay))
话虽如此,听起来您对可能属于 object 属性的对象的一些逻辑进行了硬编码。 这两个对象有什么特别之处,这意味着它们需要首先列出。 将来可能会有第三个特殊的 object 吗? 在 object 中添加诸如“精选”之类的标志可能是对您尝试解决的业务问题进行建模的一种更灵活的方式。
SearchItems.OrderBy(x => (x.SearchType == Foo || x.SearchType == Bar) ? 0 : 1);
这将导致列表顶部的SearchType
= Foo
或Bar
以及之后的所有其他内容。 如果你想要 Foo 在 Bar 之前,你可以得到更具体的信息:
SearchItems.OrderBy(x => x.SearchType == Foo ? 0 : x.SearchType == Bar ? 1 : 2);
在您的示例中,我不知道SearchType
是什么或Foo
或Bar
,但我认为您明白了。
在此示例中,将用于排序的类型是int
,默认排序是 Ascending(从小到大)。 因此,上面的 OrderBy 表达式将返回0
表示Foo
将其放在首位, 1
表示Bar
将其放在第二位, 2
表示将其放在 Foo 和 Bar 之后的任何其他内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.