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); }
6 Réponses :
à 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));
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);
RemoveAll ne fonctionne pas sur IList, qui était la question initiale.
Cette réponse ne s'applique pas à la question initiale.
dépend, si vous avez implémenté sinon: p> iéquatif code> sur votre utilisateur à comparer par le
ID code>, vous pouvez simplement faire
_players.remove (utilisateur) code >.
Il existe deux scénarios, la variable code> utilisateur code> que vous passez à de votre échantillon de code, il est impossible de dire. P>
Pour le premier cas, appelez simplement supprimerPlayer code> p>
_players.remove (utilisateur) code>. Pour le second cas, implémentez le
Système.Equatifble
interface sur utilisateur code> pour définir une référence par défaut
EqualitComParer
_players.remove (utilisateur) code>. Ce deuxième scénario travaille dans les deux cas. P>
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 :)
uniquement dans le cas si vous avez Tous les algorithmes mentionnés avec 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> Liste
SingleEfault () Code> /
/
FirstOrdefault () code> nécessite deux traverses parmi la liste: p>
int index = list.FindIndex(i => criteria);
if (index >= 0)
list.RemoveAt(index);
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;
}