2017-10-15 2 views
1

est-il une alternative pour objet la suppression d'une liste au lieu de ce que je l'ai fait avec foreach;faire le supprimer à partir d'une liste avec condition plus rapide

Je veux dire que je ne pense pas que la façon dont je fais est la meilleure façon et d'optimiser ainsi

comme ceci:

var allobj= .. //this a list of all object 
var myobj= .. //this a list of my selected object 
foreach (var inu in myobj.ToArray()) 
{ 
    if (allobj.Where(p => p.UserName == inu.UserName).Count() != 0) 
    { 
     myobj.Remove(inu); 
    } 
} 
+0

Ajouter une propriété à tous les objets 'IsSelected' puis retirer l'objet si la propriété est'on' ou faire un HashSet avec les noms de l'objet sélectionné et vérifiez si le nom de l'objet est dans le HashSet. – FCin

+0

la condition est sur UserName – keuone72

+0

Peu importe sur quelle propriété la condition est. Dans votre code lorsque vous ajoutez un objet à 'myobj', vous pouvez le définir' IsSelected' sur 'true', puis le supprimer plus tard. – FCin

Répondre

4

D'autres réponses ont inconvénient, et qui est « la création de la nouvelle collection hors éléments » au lieu de supprimer articles de la collection réelle.

Cette approche ne copie pas de la collection principale, il supprimera les éléments de la liste directement à une vitesse optimale.

Vous allez générer HashSet de vos articles sélectionnés afin que vous pouvez rechercher des chaînes dans HashSet à vitesse constante.

// generate hashset from selected items 
var set = new HashSet<string>(myobj.Select(x => x.UserName)); 

// remove all items from list. 
allobj.RemoveAll(x => set.Contains(x.UserName)); 
1

Vous ne pouvez pas supprimer de la liste que vous itérez dans.

Quoi qu'il en soit, vous pouvez construire une nouvelle liste contenant tous les éléments où le nom d'utilisateur ne figure pas dans la liste globale:

var finalList = myobj.Where(obj => allobj.Any(o => o.UserName != 
obj.UserName)).ToList(); 
+2

OP ne pas supprimer de la liste itérée. collection Iterated est un tableau – Fabio

1

Si vous voulez supprimer des objets de myobj qui UserName existe dans allobj, puis

var selected = myobj.Where(obj => allobj.Any(o => o.UserName == obj.UserName)).ToList(); 
1

Si les objets dans ces listes ont la même référence, alors pour obtenir tous sauf les éléments sélectionnés vous pouvez simplement utiliser:

var r = allItems.Except(selectedItems).ToList(); 

Si elles ne sont pas la même référence, vous pouvez créer le résultat de cette façon:

var r = allItems.Where(x => !selectedItems.Any(y => y.UserName == x.UserName)).ToList(); 
+0

s'il peut y avoir deux éléments avec la même référence dans une liste, première approche ne fonctionnera pas comme prévu .. –

+0

@ M.kazemAkhgary La première option, supprime toutes les instances d'éléments choisis parmi tous les éléments, quel que soit le nombre de apparence. Donc, fondamentalement, cela fonctionne comme prévu. –