当与orderby一起使用时,升序关键字的存在纯粹是为了清晰吗

本文关键字:纯粹 存在 清晰 关键字 一起 orderby 升序 当与 | 更新日期: 2023-09-27 17:58:43

如果我进行查询,按如下顺序排列元素,我将获得升序。

var i = from a in new int[] { 1, 2, 3, 4, 5 }
        orderby a
        select a;

如果我添加ascending关键字,我会得到相同的结果。

var i = from a in new int[] { 1, 2, 3, 4, 5 }
        orderby a ascending
        select a;

我认识到,在第二个示例中添加ascending关键字可以提高可读性,因为它不需要知道orderby的默认顺序。

ascending关键字存在还有其他原因吗

我也很想知道为什么这个(突破性的改变?)是为了在一个特定的情况下使用而实现的。

编辑:见下面的评论,@Joey指出,这不是一个突破性的变化,因为它是一个上下文关键字。

当与orderby一起使用时,升序关键字的存在纯粹是为了清晰吗

是的,它是多余的。当它做任何不同的事情时,没有任何情况,因为顺序是隐含的升序。

我想它提供了完整性,但在语言中引入一个如此…无能的关键字似乎确实是一种耻辱。

但另一方面:

  • 它模仿SQL,SQL在语义方面有广泛的相关性
  • 它避免了"我该怎么办?"的问题
  • 它没有害处,也没有人强迫你使用它
  • 如果你有a descending, b ascending, c descending, d ascending等,它(可以说)会让事情变得更清楚

示例(见注释)order by a, order by b实际上与order by a, b非常不同:

public static void Main()
{
    var data = new[] { new { X = 1, Y = 1 }, new { X = 1, Y = 2 },
                       new { X = 2, Y = 1 }, new { X = 2, Y = 2 } };
    foreach (var pair in from p in data orderby p.X, p.Y select p)
    {
        Console.WriteLine("{0},{1}", pair.X, pair.Y);
    }
    Console.WriteLine();
    foreach (var pair in from p in data orderby p.X orderby p.Y select p)
    {
        Console.WriteLine("{0},{1}", pair.X, pair.Y);
    }
}

打印:

1,1
1,2
2,1
2,2
1,1
2,1
1,2
2,2

请注意,中间的两个相反。这是因为之间的差异

data.OrderBy(p => p.X).ThenBy(p => p.Y)

在第一个循环中,以及

data.OrderBy(p => p.X).OrderBy(p => p.Y)

在第二个。

因为LINQ试图保证稳定的排序(即,当存在匹配时,数据按原始顺序保留),OrderBy().OrderBy()执行第一次排序(在X上),然后返回数据,当Y匹配时只查看原始(按X排序)顺序。或者换句话说:它将它们从左向右翻转。