在LINQ中,执行IOrderedEnumerable 的预测是否保留顺序?

如果我有一个IOrderedEnumberable ,我IOrderedEnumberable它进行排序,然后进行投影查询…

投影中保留的顺序是什么?

例如,这种情况有效吗?

 IOrderedEnumberable allCarsOrderedFastestToSlowest = GetAllCars() .OrderByDescending(car=>car.TopSpeed); var top3FastestCarManufacturers = allCarsOrderedFastestToSlowest .Select(car=>car.Manufacturer) .Distinct() .Take(3); 

top3FastestCarManufacturers变量的名称是否传达了代码中实际发生的含义?

Distinct方法的文档没有说明是否保留订单。 这可能是因为它取决于源的底层实现。

您可以使用分组来获得所需的结果,通过从每个制造商获得最快的汽车,然后从中获得最快的三个:

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

我怀疑将要弄乱你的是Distinct。 这可能会使制造商对结果重新排序以产生不同的结果。 我可能只是遍历列表,直到我有三个不同的制造商。

选择将保留顺序,但Distinct上的注释表示它返回无序结果集并且它是依赖于实现的。 可以肯定的是,我不会依赖它保留顺序,只需使用迭代即可。

 var top3 = new List(); foreach (var manufacturer in allCarsOrderedFastestToSlowest .Select(car=>car.Manufacturer)) { if (!top3.Contains(manufacturer)) { top3.Add(manufacturer); if (top3.Count == 3) { break; } } }