c# - C# 中的 List.Orderby 首先排序为偶数升序的数字,然后为奇数降序的相同数字

标签 c# list linq sorting

我有一个名为 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();

关于c# - C# 中的 List.Orderby 首先排序为偶数升序的数字,然后为奇数降序的相同数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16254173/

相关文章:

java - 在Java 7和8中创建与现有列表不同的列表?

python - 使用列表中包含的特定字符串对一个列表进行排序

c# - P/Invoke - 使用 DLLImport 的自定义类型的 C# 签名?

c# - 如何在 EditorFor 中访问 C# 模型属性

C# 将较大的方法分成两个线程

c# - Plain ArrayList Linq c# 2 语法(需要转换)

c# - 在代码隐藏中使用 XDocument 时出错

c# - 如何获取reCAPTCHA图片地址?

python - 根据项目的长度将 python 列表拆分成 block

c# - 如何首先循环遍历 Entity Framework 4.1 代码中的子对象列表