Ошибка подписи OrderBy в книге Pro LINQ?
Согласно Pro LINQ: Language Integrated Query в C# 2008, прототипом оператора OrderBy является
public static IOrderedEnumerable<T> OrderBy<T, K>(
this IEnumerable<T> source,
Func<T, K> keySelector)
where
K : IComparable<K>
Но документация MSDN не имеет общего ограничения на TKey, что он должен быть типа IComparable<TKey>
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
)
Я в основном сортирую инвентарь по единице, а затем по размеру.
var sortedInventories = inventories
.OrderBy(inventory => inventory.Unit)
.OrderBy(inventory => inventory.Size);
Из приведенного выше фрагмента кода лямбда-выражения просто возвращают свойства инвентаря для сортировки. Это не похоже на выражение, которое возвращает IComparer<T>
Но согласно логике, похоже, что лямбда-выражение должно иметь тип IComparer<T>
,
Какой из них является правильным объявлением OrderBy
?
(На странице ошибок Apress.com нет информации)
Вот пример приложения, которое я создал для тестирования OrderBy
public class Program
{
public static void Main(string[] args)
{
var inventories = new[] {
new Inventory { Unit = 1, Size = 2 },
new Inventory { Unit = 2, Size = 4 },
new Inventory { Unit = 3, Size = 6 },
};
var sortedInventories = inventories
.OrderBy(inventory => inventory.Unit)
.OrderBy(inventory => inventory.Size);
foreach (var inventory in sortedInventories)
Console.WriteLine("Unit: {0}; Size = {1}", inventory.Unit, inventory.Size);
}
}
public class Inventory
{
public int Unit { get; set; }
public double Size { get; set; }
}
1 ответ
Измените свой второй "OrderBy" на "ThenBy". Вы в настоящее время прибегаете ко всему, так что это эффективно по размеру, а затем по единице, но неэффективно. Я не уверен, где вы думаете IComparer<T>
должен прийти, если вы не укажете это в качестве другого аргумента. В основном это использует Comparer<T>.Default
если вы не укажете отдельный компаратор.
В любом случае, ваш запрос должен быть:
var sortedInventories = inventories
.OrderBy(inventory => inventory.Unit)
.ThenBy(inventory => inventory.Size);
(С вашими данными испытаний вы не можете сказать разницу, потому что в каждом случае Size = Unit * 2
, Попробуйте это с одним предметом, который имеет маленький юнит и большой размер.)
Да, похоже, что книга получила немного неправильную подпись - возможно, из-за того, что она изменилась незадолго до выпуска. Если вы в основном беспокоились о получении неправильных результатов, объяснение приведено выше.