Список удалить диапазон, передав список в качестве аргумента - PullRequest
0 голосов
/ 04 января 2019

У меня есть список пропущенных элементов, подобных этому, и я пытаюсь выполнить массовую операцию с моей таблицей БД, вынимая небольшие куски элементов из существующего списка (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 принимает только два целых числа в качестве аргументов (от и до): /

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Я считаю, что вы можете просто сделать:

castedItems.RemoveRange(0,2500);
0 голосов
/ 04 января 2019

Если у вас есть хороший компаир, вы можете сделать, кроме.

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

Пропустить - это "обратный" прием.

Пропустить в этом случае также намного быстрее, чем RemoveRange или За исключением двух причин, выделение не требуется, и оно может быть ленивым.

0 голосов
/ 04 января 2019
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?           
  }

Попробуйте, обновление смещения предела может потребоваться обновить. Не проверял рабочий

...