Если я возьму несколько вольностей на вашем примере и проверю их в LINQPad, вот что я получу:
Методы
List<T> GetNumbers<T>(List<T> nums){
return nums.Where(d => d is T).ToList<T>();
}
List<T> GetNumbersOfType<T>(List<T> nums){
return nums.OfType<T>().ToList<T>();
}
IL
GetNumbers:
IL_0000: ldarg.1
IL_0001: ldnull
IL_0002: ldftn 05 00 00 2B
IL_0008: newobj 0A 00 00 0A
IL_000D: call 06 00 00 2B
IL_0012: call 07 00 00 2B
IL_0017: ret
GetNumbersOfType:
IL_0000: ldarg.1
IL_0001: call 08 00 00 2B
IL_0006: call 07 00 00 2B
IL_000B: ret
Я не эксперт по IL, но похоже, что метод GetNumbers
(который использует синтаксис Where
) создает новый объект каждый раз в цикле и поэтому, вероятно, потребляет немного больше памяти, чем GetNumbersOfType
метод (который использует OfType
).