c# - 从对象类型转换回自定义对象并改进代码
问题描述
我有一段代码,我在一个对象类型的集合中打包了几种类型的对象。它们需要插入到数据库中。我在代码下方使用 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 种不同的对象类型,我想知道是否可以避免代码中的一些重复。此外,我想在不影响性能甚至提高当前性能的情况下做到这一点,这要归功于我正在使用的库,这是完全可以接受的。
提前谢谢了
乙
解决方案
听起来像是一份工作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 个列表等,等,等
推荐阅读
- android - 为什么 Duo、whatsapp、skype 等应用在原生联系人的 RawContact 表中有条目
- facebook - 我们如何通过 v3.3 API 访问 Facebook 应用洞察?
- r - 基于条件语句使用 mutate() 计算有序观察
- node.js - Nodejs:如何检查生成是否成功?
- python - 散景第二个图例显示散射半径
- postgresql - 在 RedHat 中连接 postgresql 失败
- android - Android unit testing Location not mocked
- c++ - 强制终止并重新生成 TCP 套接字应用程序时无法重用端口
- ios - iOS SceneKit 应用程序在 App Switcher 模式下更快
- angular - 当用户在角度加载之前单击预呈现链接时,引荐来源网址丢失