В 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;
}
}
}