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

时间:2019-01-04 14:38:59

标签: c# linq c#-4.0 extension-methods

我有一个这样的缺失项列表,我试图通过从现有列表中取出一小部分项(一次2500个项)来对我的数据库表执行批量操作:

 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):/

3 个答案:

答案 0 :(得分:0)

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?           
  }

尝试此操作,可能需要更新偏移量限制更新。没有检查工作情况

答案 1 :(得分:0)

我相信您可以做到:

castedItems.RemoveRange(0,2500);

答案 2 :(得分:0)

假设您有一个好的同伴,可以做。

castedItems = castedItems.Except(subList);

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

那是一般情况。您可以使用跳过:

var castedItems = castedItems.Skip(2500);

跳过是止步的“反向”。

在这种情况下,跳过操作也比RemoveRange或RemoveRange快得多。由于两个原因,不需要分配,并且它可以很懒。