通过将列表作为参数传递来列表删除范围

List remove range by passing list as argument

我有一个这样的缺失项目列表,我正在尝试通过从现有列表中取出小块项目(一次 2500 个项目)对我的数据库 table 执行批量操作:

 var castedItems = missingItems.ToList();
  while (castedItems.Any())
  {
    var subList = castedItems.Take(2500).ToList();
    DBRetry.Do(() => EFBatchOperation.For(ctx, 
    ctx.SearchedUserItems).InsertAll(subList), TimeSpan.FromSeconds(2));
    castedItems.RemoveRange(subList);           
  }

缺少的物品是并发包,而铸造的物品是列表。现在我应该创建一个扩展方法来接受我取出的列表并快速删除插入数据库的 2500 个项目......但我不太确定该怎么做......

有人可以帮我吗?

P.S。有问题的部分是这个:

castedItems.RemoveRange(subList);           

它说 removerange 只接受两个整数作为参数( from 和 to ):/

var castedItems = missingItems.ToList();
var offset = 0;
var limit = 0;
  while (castedItems.Any())
  {
    var subList = castedItems.Take(2500).ToList();
limit = limit + 2500;
    DBRetry.Do(() => EFBatchOperation.For(ctx, 
    ctx.SearchedUserItems).InsertAll(subList), TimeSpan.FromSeconds(2));
    castedItems.RemoveRange(offset, limit);
offset = offset + limit?           
  }

试试这个,偏移限制更新可能需要更新。没有检查工作

我相信你可以简单地做到:

castedItems.RemoveRange(0,2500);

假设你有一个好的编译器,你可以做 Except。

castedItems = castedItems.Except(subList);

https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.except?view=netframework-4.7.2

这是一般情况。在您的情况下,您可以使用 skip:

var castedItems = castedItems.Skip(2500);

Skip 是 "reverse" 的 take。

这种情况下的 Skip 也比 RemoveRange 或 RemoveRange 快得多,除了两个原因外,不需要分配并且它可以是惰性的。