7
votes

trouver et retirer de Ilist

J'ai un IList des utilisateurs

public virtual void RemovePlayer(User User)
{
    int index=_Players.Select(T=>T.ID).ToList().IndexOf(User.ID);
    _Players.RemoveAt(index);
}


0 commentaires

6 Réponses :


12
votes

à quoi ça se passe? Utilisez ceci si votre paramètre utilisateur code> ne fait pas partie de _players code>.

 _Players.Remove(_Players.SingleOrDefault(x => x.ID == User.ID));


0 commentaires

10
votes

Si les objets code> utilisateur code> que vous utilisez sont conservés dans la liste _ lecteurs code> (mêmes références d'objet), vous pouvez simplement faire

_Players.RemoveAll( p => p.ID == user.ID);


2 commentaires

RemoveAll ne fonctionne pas sur IList, qui était la question initiale.


Cette réponse ne s'applique pas à la question initiale.



5
votes

dépend, si vous avez implémenté iéquatif sur votre utilisateur à comparer par le ID , vous pouvez simplement faire _players.remove (utilisateur) .

sinon: xxx


0 commentaires

7
votes

Il existe deux scénarios, la variable utilisateur que vous passez à supprimerPlayer

  1. est en réalité contenu dans votre liste
  2. a la même valeur , mais n'est pas le même objet.

    de votre échantillon de code, il est impossible de dire.

    Pour le premier cas, appelez simplement _players.remove (utilisateur) . Pour le second cas, implémentez le Système.Equatifble interface sur utilisateur pour définir une référence par défaut EqualitComParer , puis appelez à nouveau _players.remove (utilisateur) . Ce deuxième scénario travaille dans les deux cas.


2 commentaires

Cette solution aide beaucoup parce que j'utilise des génériques et je peux supprimer des objets sans avoir besoin de connaître les propriétés qu'ils contiennent.


@David sur ce vote pour les gens basé principalement sur le score de l'affiche plutôt que la réponse; c'est bien mis en évidence ici :)



2
votes

uniquement dans le cas si vous avez Liste code>: strong>

Tous les algorithmes mentionnés avec SingleEfault () Code> / / FirstOrdefault () code> nécessite deux traverses parmi la liste: p>

1) d'abord pour trouver un élément par critère p>

2) secondaire pour trouver l'index de l'élément par sa valeur trouvée À l'étape 1 p>

Il est un peu plus efficace de faire comme ça à la place: P>

int index = list.FindIndex(i => criteria);

if (index >= 0)
  list.RemoveAt(index);


0 commentaires

0
votes

Je voulais juste faire la même chose, mais je n'ai pas trouvé de manière standard. de
A décidé d'aller le code moi-même pour mes listes INT. Ce petit ne sera pas double-passer sur la liste!
Vous pouvez remplacer int code> par objet code> pour fonctionner avec des classes.

public static bool FindAndRemoveFirst(this ICollection<int> list, Func<int, bool> predicate)
{
    var en = list.GetEnumerator();
    while (en.MoveNext())
    {
        if (predicate(en.Current))
        {
            list.Remove(en.Current);
            return true;
        }
    }
    return false;
}


0 commentaires