列表.c#中的顺序首先是偶数顺序,然后是奇数递减顺序
本文关键字:顺序 然后 列表 | 更新日期: 2023-09-27 18:11:04
我有一个名为myDeliverable的列表
myDeliverable
包含一个名为Buyer
的对象。Buyer
有一个string street
和一个int housenumber
现在我想先按街道字母顺序排序,然后按从0、1、2、3开始偶数升序排列的门牌号排序。N,然后是奇数递减的门牌号。所以输出应该是这样的:
AAstreet 2
AAstreet 10
AAstreet 12
AAstreet 20
AAstreet 13
AAstreet 9
AAstreet 1
BAstreet 4
BAstreet 8
BAstreet 3
(...)
所以我写了如下内容:
myDeliverables = myDeliverables
.OrderBy(x => x.Buyer.Street)
.ThenBy(x => x.Buyer.Housenumber).Where(x => x.Buyer.Housenumber % 2 == 0) // even
.ThenBy(x => x.Buyer.Housenumber).Where(x => x.Buyer.Housenumber % 2 != 0) // odd
.ToList();
VS给了我一个错误.ThenBy(x => x.Buyer.Housenumber
,说有些东西没有.ThenBy
方法。我想我该去哪里做点什么。不知道怎么做,以前没有使用过LINQ
问题是,当您调用.Where
时,它实际上是过滤列表中的元素—.Where(x.Buyer.HouseNumber % 2 == 0)
将只给您留下偶数门牌号。它在.ThenBy
上抛出编译时错误,因为Linq在某种意义上"忘记"了列表已排序。但即使不是这样,.Where(x.Buyer.HouseNumber % 2 != 0)
也会过滤掉的偶数门牌号码。因此,即使你的排序工作,你会留下一个空列表。
首先需要按数字的奇偶性排序(无论是偶数还是奇数),然后按数字本身排序。您可以使用奇偶校验来决定是升序排序还是降序排序。
试试这个:
myDeliverables = myDeliverables
.OrderBy(x => x.Buyer.Street)
.ThenBy(x => x.Buyer.Housenumber % 2) // parity
.ThenBy(x => x.Buyer.Housenumber % 2 == 0
? x.Buyer.Housenumber // evens ascending
: -x.Buyer.Housenumber) // odds descending
.ToList();