3

我有一个名为 myDeliverable 的列表

myDeliverable包含一个名为 的对象BuyerBuyer有一个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。

4

1 回答 1

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();
于 2013-04-27T16:06:38.177 回答