List.Orderby在C#中的第一个orderby数字甚至asc然后相同的数字是奇数下降

gan*_*jan 3 c# linq sorting list

我有一个叫做myDeliverable的List

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
(...)
Run Code Online (Sandbox Code Playgroud)

所以我写了以下内容:

    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();
Run Code Online (Sandbox Code Playgroud)

VS给了我一个错误,.ThenBy(x => x.Buyer.Housenumber说某些东西没有.ThenBy方法.我假设我必须在最后做什么.不知道怎么做,以前没用过LINQ.

p.s*_*w.g 6

问题在于,当你调用.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();
Run Code Online (Sandbox Code Playgroud)