从对象类型转换回自定义对象并改进代码

时间:2018-09-21 09:22:41

标签: c# .net-core

我有一段简短的代码,其中我在对象类型的集合中打包了几种类型的对象。它们需要插入数据库中。 我使用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多种不同的对象类型,我想知道我是否可以避免代码中的某些重复。另外,我想做到这一点而不影响性能,甚至不能提高当前性能,这要归功于我使用的库。

非常感谢

B

1 个答案:

答案 0 :(得分:4)

听起来像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)。

如果您想要一种更高效,更冗长的方法,类似于您所拥有的,却又更现代,更高效的方法。您可以在switch

中使用C#7.0 模式匹配
foreach (var record in mappedContent)
    switch (record )
    {
        case TypeA typeA:
            tAlist.Add(typeA);
            break;
        ...

这将为您提供平坦的O(n),尽管您将必须列出20个ect,ect,ect