-1
votes

Liste Supprimer la plage en passant comme argument

J'ai une liste d'articles manquants comme celui-ci et j'essaie d'effectuer une opération en vrac contre ma table de base de données en supprimant de petits morceaux d'éléments de la liste existante (2500 articles à la fois):

castedItems.RemoveRange(subList);           


10 commentaires

Avez-vous essayé de passer le décalage et de la limite? Comme 0 et 2500 première fois?


quelque chose comme ça casteditems.except (subliste) .tolist ();


@Milindanantwar veulent-tu dire comme: casteditems = casteditems.except (subliste) .tolist (); ?


@Akbarbadhusha Pouvez-vous me montrer un exemple?


@ User987: oui. Vous pouvez faire ce casteditems = casteditems.except (subliste) .tolist ();


Pourquoi ne pas simplement faire: casteditems.removerange (0.2500);


@apomene ou l'exemple comme Milind Anantwar montré, lequel serait mieux?


@ User987: celui que Apomene a partagé :). Comme ma solution iTère dans la liste complète, puis supprime les éléments.


Si vous souhaitez supprimer des articles de l'avant de la collection, vous devez vraiment utiliser une file d'attente, pas une liste. Ces opérations sont certaines des opérations les plus inefficaces que vous puissiez effectuer sur une liste. Une file d'attente est spécialement conçue pour faire exactement ce type de chose efficacement. Cela suppose que vous devez mettre les articles dans une nouvelle collection du tout , plutôt que simplement itération manquantItems et ne mettant jamais les éléments dans une question matérialisée pour commencer (ce qui serait idéal si réalisable).


@apomene pouvez-vous publier votre solution finale car celle-ci semble être la plus efficace? :)


3 Réponses :


0
votes
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?           
  }
Try this, offset limit updating might need to updated. Didn't check the working

0 commentaires

0
votes

Je crois que vous pouvez simplement faire:

castedItems.RemoveRange(0,2500);


0 commentaires

0
votes

En supposant que vous ayez un bon compaire que vous pouvez faire, sauf.

var castedItems = castedItems.Skip(2500);


0 commentaires