我有一段简短的代码,其中我在对象类型的集合中打包了几种类型的对象。它们需要插入数据库中。 我使用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
答案 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
foreach (var record in mappedContent)
switch (record )
{
case TypeA typeA:
tAlist.Add(typeA);
break;
...
这将为您提供平坦的O(n),尽管您将必须列出20个ect,ect,ect