首页 > 解决方案 > 从对象类型转换回自定义对象并改进代码

问题描述

我有一段代码,我在一个对象类型的集合中打包了几种类型的对象。它们需要插入到数据库中。我在代码下方使用 EF core 2.1 和一个流行的扩展,称为 EFCore.BulkExtensions:

 List<object> mappedContent = MapContent(elements, mappings);// a million records

List<typeA> tAlist= new List<typeA>();
List<typeB> tBlist= new List<typeB>();
List<typeC> tClist= new List<typeC>();


            foreach (var record in mappedContent)
            {
                switch (record.GetType().Name)
                {
                    case "TypeA":
                        tAlist.Add((TypeA)record);
                        break;
                    case "typeB":
                        tBlist.Add((typeB)record);
                        break;
                    case "typeC":
                        tClist.Add((typeC)record);
                        break;
                   default:
                    Throw new Exception(" Unknown type");

}
}

 context.BulkInsert(tAlist);
 context.BulkInsert(tBlist);
 context.BulkInsert(tClist );

我有超过 20 种不同的对象类型,我想知道是否可以避免代码中的一些重复。此外,我想在不影响性能甚至提高当前性能的情况下做到这一点,这要归功于我正在使用的库,这是完全可以接受的。

提前谢谢了

标签: c#.net-core

解决方案


听起来像是一份工作OfType

根据指定类型过滤 IEnumerable 的元素。

var tAlist = mappedContent.OfType<TypeA>();
// do wonderful fun stuff with a list of TypeA

请注意,在性能方面,这可能会比您使用的要好。但是来源OfType基本上是

foreach (object obj in source) 
{
    if (obj is TResult) yield return (TResult)obj;
}

它基本上是每次调用它的时间复杂度 O(n)。

如果您想要一种更有效但更冗长的方法,类似于您所拥有的,但更现代和高性能的方法。您可以使用C# 7.0模式匹配switch

foreach (var record in mappedContent)
    switch (record )
    {
        case TypeA typeA:
            tAlist.Add(typeA);
            break;
        ...

它会给你平坦的 O(n),尽管你必须制作 20 个列表等,等,等


推荐阅读