通用扩展方法:将一种集合转换为另一种集合

5

我是一名从事IT技术的助手,您需要翻译的内容是关于代码库中大量一级集合的使用。为了方便使用LINQ处理这些集合,每个集合都有一个扩展方法,例如:

public static class CustomCollectionExtensions
{
    public static CustomCollection ToCustomCollection(this IEnumerable<CustomItem> enumerable)
    {
        return new CustomCollection(enumerable);
    }
}

伴随相应的构造函数:
public class CustomCollection : List<CustomItem>
{
    public CustomCollection(IEnumerable<CustomItem> enumerable) : base(enumerable) { }
}

这段代码看起来是样板代码,因此我尝试编写一个通用的 IEnumerable<U>.To<T>() 方法,这样我们就不需要一直生成特定的 ToXCollection() 方法了。
我已经完成了以下部分:
public static class GenericCollectionExtensions
{
    public static T To<T, U>(this IEnumerable<U> enumerable) where T : ICollection<U>, new()
    {
        T collection = new T();
        foreach (U u in enumerable)
        {
            collection.Add(u);
        }
        return collection;
    }
}

这需要像这样调用:customCollectionInstance.OrderBy(i => i.Property).To<CustomCollection, CustomItem>()

有没有一种方法可以避免指定CustomItem类型,以便我们可以使用customCollectionInstance.OrderBy(i => i.Property).To<CustomCollection>(),或者这不是通用的解决方案?


2
很抱歉,没有。 - MarcinJuraszek
你为什么要有那么多不同的集合?看起来像是代码异味。 - svick
@svick - 有很多集合是因为这是一个庞大的代码库,而且一流的集合比通用对象集合更受青睐,以便有地方封装基于集合的规则,而不是相对于通用 IWhatever<DomainObject> 定义它们。我不确定这是好决定还是坏决定,但我知道 var a = Member.Offers.ActiveOffers() 看起来比每次都使用 .Where() 更简洁。 - Justin Edwards
1个回答

5

以下是与您所需内容相近的内容:

public static class GenericCollectionExtensions
{
    public sealed class CollectionConverter<TItem>
    {
        private readonly IEnumerable<TItem> _source;

        public CollectionConverter(IEnumerable<TItem> source)
        {
            _source = source;
        }

        public TCollection To<TCollection>()
            where TCollection : ICollection<TItem>, new()
        {
            var collection = new TCollection();
            foreach(var item in _source)
            {
                collection.Add(item);
            }
            return collection;
        }
    }

    public static CollectionConverter<T> Convert<T>(this IEnumerable<T> sequence)
    {
        return new CollectionConverter<T>(sequence);
    }
}

使用方法:

customCollectionInstance.OrderBy(i => i.Property).Convert().To<CustomCollection>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接