Да, это избыточно.Нет никаких обстоятельств, когда он делает что-то иное, поскольку порядок неявно возрастает.
Полагаю, он обеспечивает полноту, но действительно кажется стыдным вводить ключевое слово в столь ... бессильный язык.
С другой стороны, хотя:
- он имитирует 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 совпадают.Или другими словами: он переворачивает их слева направо.