Как избежать ненужных вычислений в запросах LINQ с использованием OrderBy, за которым следует несколько предложений thenC#

Место общения программистов C#
Ответить
Anonymous
 Как избежать ненужных вычислений в запросах LINQ с использованием OrderBy, за которым следует несколько предложений then

Сообщение Anonymous »

Вот упрощенный пример:

Код: Выделить всё

using System;
using System.Linq;

class Program
{
static void Main()
{
var data = new[]
{
new { Name = "Alice", Age = 30 },
new { Name = "Bob", Age = 25 },
new { Name = "Charlie", Age = 25 }
};

var sorted = data
.OrderBy(x => Tracer("First criterion", x.Age))
.ThenBy(x => Tracer("Second criterion", x.Name));

foreach (var item in sorted)
{
Console.WriteLine($"{item.Name} - {item.Age}");
}
}

static T Tracer(string label, T value)
{
Console.WriteLine($"Computing {label} key: {value}");
return value;
}
}

// Output displayed on the screen:
// Computing First criterion key: 30
// Computing First criterion key: 25
// Computing First criterion key: 25
// Computing Second criterion key: Alice
// Computing Second criterion key: Bob
// Computing Second criterion key: Charlie
// Bob - 25
// Charlie - 25
// Alice - 30
Мы можем заметить, что LINQ оценивает второй критерий () для всех элементов, а не только для тех, которые остались после первого OrderBy.
Другими словами, ключи сортировки всех предложений thenBy вычисляются для всей коллекции.
Есть ли способ обойти это поведение?

Подробнее здесь: https://stackoverflow.com/questions/798 ... lowed-by-m
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»