Сначала я подумал, что это будет плохой идеей, поскольку алгоритм сортировки должен будет выполнить несколько сравнений для чисел, и он будет получать разные ключи сортировки для одного и того же числа каждый раз, когда он вызывает лямбду для этого числа. Однако, похоже, он вызывает его только один раз для каждого элемента в списке и сохраняет это значение для последующего использования. Этот код демонстрирует это:
int timesCalled = 0;
Random rnd = new Random();
List<int> numbers = Enumerable.Range(1, 100).OrderBy(r =>
{
timesCalled++;
return rnd.Next();
}
).ToList();
Assert.AreEqual(timesCalled, 100);