Существует ли восходящее ключевое слово исключительно для ясности при использовании с orderby? - PullRequest
8 голосов
/ 08 июня 2011

Если я делаю запрос, упорядочивая элементы, как показано ниже, я получаю возрастающий порядок.

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 указывает, это не серьезное изменение, поскольку это контекстное ключевое слово.

1 Ответ

7 голосов
/ 08 июня 2011

Да, это избыточно.Нет никаких обстоятельств, когда он делает что-то иное, поскольку порядок неявно возрастает.

Полагаю, он обеспечивает полноту, но действительно кажется стыдным вводить ключевое слово в столь ... бессильный язык.

С другой стороны, хотя:

  • он имитирует SQL, который широко связан с точки зрения семантики
  • он избегает "как мне?"вопросы
  • это не причиняет вреда, и никто не заставляет вас его использовать
  • это (возможно) проясняет ситуацию, если у вас есть a descending, b ascending, c descending, d ascending etc

Пример (см. Комментарии), что 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), а затем восстанавливает данные, только просматриваяв исходном (отсортированном по X) порядке, когда Ys совпадают.Или другими словами: он переворачивает их слева направо.

...