LINQ - OrderByDescending
本文关键字:OrderByDescending LINQ | 更新日期: 2023-09-27 18:03:57
请注意:截至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,
}));
等等……"项目"是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);
当然,您也可以将其作为一个查询来执行。
我假设你首先想要两个下降的物体。如果不是这样的话,那就把最后一句话转过来。
var result = asc.Concat(desc);
如果你想对列表本身进行排序,那么就做这个
this.SearchItems = desc.Concat(asc).ToList();
这个问题相当令人困惑,但如果我理解正确,你有26个对象,并且你想要这些对象的序列化列表,这样对象a首先是对象a,然后是对象B,然后是按属性C排序的所有剩余对象。
如果是这样的话,可以通过按对象A先排序来编写。
SearchItemsJson = serializer.Serialize(
this.SearchItems
.OrderByDescending(i => i.SearchType == "Foo")
.ThenByDescending(i => i.SearchType == "Bar")
.ThenBy(i => i.ItemDisplay)
.ThenBy(i => i.CategoryDisplay))
话虽如此,听起来像是对对象的一些逻辑进行了硬编码,这些逻辑可能属于对象的属性。这两个对象的特殊之处在于,它们需要首先列出。你将来会有第三件特别的东西吗?在对象中添加诸如"Featured"之类的标志可能是对您试图解决的业务问题进行建模的一种更灵活的方式。
SearchItems.OrderBy(x => (x.SearchType == Foo || x.SearchType == Bar) ? 0 : 1);
这将导致SearchType
=Foo
或Bar
在列表的顶部,以及后面的所有内容。如果你想要Foo before Bar with:,你可以得到更具体的信息
SearchItems.OrderBy(x => x.SearchType == Foo ? 0 : x.SearchType == Bar ? 1 : 2);
在你的例子中,我不知道SearchType
、Foo
或Bar
是什么,但我想你已经明白了。
在本例中,将用于排序的类型为int
,默认排序为升序(从小到大(。因此,上面的OrderBy表达式将为Foo
返回0
(将其放在第一位(,为Bar
返回1
(将其放置在第二位(,并为其他任何位于Foo和Bar之后的内容返回2
。