【问题标题】:Sorting orderlines with different criteria in linq在 linq 中对具有不同标准的订单线进行排序
【发布时间】:2020-11-24 09:51:51
【问题描述】:

我尝试过使用 OrderByDescending 和 OrderBy 但是我无法得到正确的结果。

以下是要排序的数据示例:

ol1.SKU = "323";
ol1.SubTotal = 12;

ol2.SKU = "Avante";
ol2.SubTotal = 12;

ol3.SKU = "143";
ol3.SubTotal = 13456;

ol4.SKU = "444";
ol4.SubTotal = 2;

ol5.SKU = "znote";
ol5.SubTotal = 0;

排序后我想要的那种结果:

Output:
ol3
ol2
ol1
ol4
ol5

排序规则:

  1. 最贵(小计)SKU 优先
  2. 任何包含字符串 AVANTE 的 SKU
  3. 所有其他订单项
  4. Notes(ZNote) 排在最后。

我试过这样,但它没有返回正确的输出。

private List<OrderLine> SortByOrderlines(List<OrderLine> ol)
{
    return ol.OrderByDescending(x => x.SubTotal).ThenByDescending(x => x.SKU == "AVANTE").OrderBy(x => x.SKU == "ZNOTE").ToList();
}

【问题讨论】:

  • 如果你想搜索包含 avante 的字符串,你可能需要这样做(x =&gt; x.SKU.Contains("AVANTE"))
  • 你能解释一下吗?结果如何“不正确”?
  • 在您的示例中,ol3 出现了两次,而 ol4 根本没有出现。对吗?
  • 你的代码有OrderBy...ThenByDescending...OrderBy。这将持续OrderBy 将丢弃之前所做的一切。你可能想要OrderBy...ThenByDescending...ThenBy
  • @canton7 我更新了

标签: c# linq asp.net-mvc-4


【解决方案1】:
    class OrderLine
    {
        public int Id { get; set; }
        public string SKU { get; set; }
        public int SubTotal { get; set; } 
    }

    class Program
    {
        static void Main(string[] args)
        {
            var data = new OrderLine[] {
                new OrderLine {
                    Id = 1,
                    SKU = "323",
                    SubTotal = 12
                },
                new OrderLine {
                    Id = 2,
                    SKU = "Avante",
                    SubTotal = 12
                },
                new OrderLine {
                    Id = 3,
                    SKU = "143",
                    SubTotal = 13456
                },
                new OrderLine {
                    Id = 4,
                    SKU = "444",
                    SubTotal = 2
                },
                new OrderLine {
                    Id = 5,
                    SKU = "znote",
                    SubTotal = 0
                },
            };

            var sortedData = data
                .OrderByDescending(x => x.SubTotal)
                .ThenByDescending(x => x.SKU.ToUpper().Contains("AVANTE"))
                .ThenByDescending(x => !x.SKU.ToUpper().Contains("AVANTE") || x.SKU.ToUpper() != "ZNOTE")
                .ThenByDescending(x => x.SKU.ToUpper() == "ZNOTE");

            System.Console.WriteLine(
                string.Join(", ", sortedData.Select(d => d.Id))
            );

        }
    }

我希望这段代码可以帮助您更好地了解您的实施可能存在的问题。

我不得不提到,根据您对规则的规范,您必须使用“包含”方法。 另外,我假设您希望对上述规则(包括最后一条)进行降序排序。但是,正如其他人提到的,您的实现中最关键的问题是使用“OrderBy”而不是“ThenBy”,这会破坏先前的排序。 还值得一提的是,如果您想精确执行规则(特别是第三条),您必须在“znote”之前添加另一条以订购“其他东西”。最后,如果您想准确比较字符串与文字,将它们标准化为相同的格式会很有帮助。

【讨论】:

  • 我使用了您的示例数据,它打印出 3、2、1、4、5,这与您提到的顺序相同。您能否再举一个例子,其中的顺序不是您想要的?
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 2010-12-23
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多