В LINQ, проекции от IOrderedEnumerable<T> сохраняют порядок?

Если у меня есть IOrderedEnumberable<Car>Я сортирую это, а затем делаю проектный запрос...

сохраняется ли порядок в проекции?

Например, работает ли этот сценарий?

IOrderedEnumberable<Car> allCarsOrderedFastestToSlowest = 
            GetAllCars()
                  .OrderByDescending(car=>car.TopSpeed);

var top3FastestCarManufacturers =
            allCarsOrderedFastestToSlowest
                  .Select(car=>car.Manufacturer)
                  .Distinct()
                  .Take(3);

Есть ли имя top3FastestCarManufacturers переменная передать смысл того, что действительно произошло в коде?

2 ответа

Решение

Документация для Distinct Метод ничего не говорит о том, сохранился ли порядок или нет. Вероятно, это потому, что это зависит от базовой реализации источника.

Вы можете использовать группировку, чтобы получить желаемый результат, получив самый быстрый автомобиль от каждого производителя, а затем получите три самых быстрых из этого:

var topThreeFastestCarManufacturers =
  GetAllCars()
  .GroupBy(c => c.Manufacturer)
  .Select(g => g.OrderByDescending(c => c.TopSpeed).First())
  .OrderByDescending(c => c.TopSpeed)
  .Take(3);

Я подозреваю, что то, что вас испортит, - это Различение. Это, вероятно, изменит порядок результатов по производителю, чтобы получить отличные результаты. Скорее всего, я бы просто перебрал список, пока у меня не появилось три разных производителя.

Выбор сохранит порядок, но замечания в Distinct указывают, что он возвращает неупорядоченный набор результатов и что он зависит от реализации. Конечно, я бы не стал полагаться на то, что он сохранит порядок, а просто сделаю это, используя итерацию.

var top3 = new List<string>();
foreach (var manufacturer in allCarsOrderedFastestToSlowest
                                .Select(car=>car.Manufacturer))
{
    if (!top3.Contains(manufacturer))
    {
        top3.Add(manufacturer);
        if (top3.Count == 3)
        {
            break;
        }
    }
}
Другие вопросы по тегам