【问题标题】:List remove range by passing list as argument通过将列表作为参数传递列表删除范围
【发布时间】:2019-01-04 14:38:58
【问题描述】:

我有一个这样的缺失项目列表,我正在尝试通过从现有列表中取出小块项目(一次 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);           
  }

Missing items 是一个 concurrent bag ,而 casted items 是 list。现在我应该创建一个扩展方法,该方法将接受我取出的列表并快速删除那些插入数据库的 2500 个项目......但我不太确定该怎么做......

谁能帮帮我?

附:有问题的部分是这个:

castedItems.RemoveRange(subList);           

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

【问题讨论】:

  • 您是否尝试通过偏移量和限制?喜欢 0 和 2500 第一次?
  • 类似castedItems.Except(subList).ToList();
  • @MilindAnantwar 你的意思是像: castedItems= castedItems.Except(subList).ToList(); ?
  • @AkbarBadhusha 你能举个例子吗?
  • 如果你想从集合的前面删除项目,你真的应该使用队列,而不是列表。这些操作是您可以对列表执行的一些最低效的操作。队列专门设计用于有效地完成这种类型的事情。这是假设您需要完全将项目放入一个新集合中,而不是仅仅迭代missingItems 并且从不将项目放入一个具体化的问题中(如果可行,这将是理想的)。

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


【解决方案1】:

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

castedItems.RemoveRange(0,2500);

【讨论】:

    【解决方案2】:
    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?           
      }
    

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

    【讨论】:

      【解决方案3】:

      假设你有一个很好的比较器,你可以做除外。

      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);
      

      跳过是拍摄的“反面”。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        相关资源
        最近更新 更多