Есть такой код:
var list1 = new int[] {0, 1, 2, 3 };
var list2 = new string[] {"a", "b", "c", "d" };
var qry =
from x in list1
from y in list2
select new { x, y };
В такой форме возвращает результат вида:
0 0 0 0
a b c d
Если поменять списки местами:
from y in list2
from x in list1
select new { x, y };
то получаем результат вида:
a a a a
0 1 2 3
Все логично. Добавляем сортировку:
from y in list2
from x in list1
orderby x descending, y descending
select new { x, y };
По логике вещей как она должна работать — на основе выражения orderby заполняется коллекция ключей, так? Потом по этой коллекции производится стабильная сортировка.
И вот тут я чего-то туплю.
Если переставлять списки местами, т.е. и так:
from y in list2
from x in list1
orderby x descending, y descending
select new { x, y };
и вот так:
from x in list1
from y in list2
orderby x descending, y descending
select new { x, y };
Результат всегда будет одинаковый. Но ведь коллекция ключей в обоих случаях должна формироваться разная.
Короче, почему это работает?