У меня есть интересная потребность в методе расширения интерфейса IEumerable - то же самое, что List.ConvertAll. Это было рассмотрено до здесь , и я нашел одно решение здесь . Что мне не нравится в этом решении, так это то, что он создает список для хранения преобразованных объектов, а затем возвращает его. Я подозреваю, что LINQ не был доступен, когда он написал свою статью, поэтому моя реализация такова:
public static class IEnumerableExtension
{
public static IEnumerable<TOutput> ConvertAll<T, TOutput>(this IEnumerable<T> collection, Func<T, TOutput> converter)
{
if (null == converter)
throw new ArgumentNullException("converter");
return from item in collection
select converter(item);
}
}
Что мне больше всего нравится в этом, так это то, что я конвертирую «на лету», не загружая весь список значений TOutput. Обратите внимание, что я также изменил тип делегата - с Converter на Func. Компиляция такая же, но я думаю, что это проясняет мои намерения - я не хочу, чтобы это было ТОЛЬКО преобразование типов.
Что приводит меня к моему вопросу: на моем уровне хранилища у меня много запросов, которые возвращают списки идентификаторов - идентификаторы сущностей. Раньше у меня было несколько классов, которые «преобразовывали» эти идентификаторы в сущности различными способами. С помощью этого метода расширения я могу свести все это к следующему коду:
IEnumerable<Part> GetBlueParts()
{
IEnumerable<int> keys = GetBluePartKeys();
return keys.ConvertAll<Part>(PartRepository.Find);
}
где «конвертер» - это метод поиска по идентификатору хранилища. В моем случае «конвертер» потенциально делает совсем немного. Кто-нибудь видит какие-либо проблемы с этим подходом?