Supprimer l'élément de la Liste et d'obtenir l'élément simultanément
En C# je suis en train d'essayer d'obtenir un élément d'une liste à un hasard de l'index. Quand il a été récupéré je veux qu'il soit enlevé de sorte qu'il ne peut pas être sélectionné plus. Il me semble que si j'ai besoin de beaucoup d'opérations pour ce faire, n'est-ce pas là une fonction où je peux simplement extraire un élément de la liste? le RemoveAt(index) la fonction est nulle. Je voudrais un avec une valeur de retour.
Ce que je fais:
List<int> numLst = new List<int>();
numLst.Add(1);
numLst.Add(2);
do
{
int index = rand.Next(numLst.Count);
int extracted = numLst[index];
//do something with extracted value...
numLst.removeAt(index);
}
while(numLst.Count > 0);
Ce que je voudrais faire:
List<int> numLst = new List<int>();
numLst.Add(1);
numLst.Add(2);
do
{
int extracted = numLst.removeAndGetItem(rand.Next(numLst.Count));
//do something with this value...
}
while(numLst.Count > 0);
Une telle "removeAndGetItem" fonction existe?
Vous devriez écrire votre propre autant que je suis au courant, seulement une Pile ou une File d'attente a ce genre de fonctionnalité intégrée. Serait-ce le besoin d'être thread-safe?
Pourquoi ne pas obtenir ce que vous voulez à une nouvelle variable/liste?
Pourquoi ne pas obtenir ce que vous voulez à une nouvelle variable/liste?
OriginalL'auteur Eirik | 2013-03-01
Vous devez vous connecter pour publier un commentaire.
Non, car c'est une violation de la pure fonction de l'étiquette, où un méthode a un effet secondaire, ou renvoie une valeur d'utilité (c'est à dire non seulement ce qui indique un état d'erreur) - jamais les deux.
Si vous voulez que la fonction apparaissent atomique, vous pouvez obtenir acquérir un verrou sur la liste, qui empêchera les autres threads d'accéder à la liste alors que vous êtes le modifier:
la première partie concernant les commandes et les requêtes est tout simplement pas vrai,
Add
a des effets secondaires et de retourner une valeur dans la même classe... c'est pas toujours pratique, prendre une Pile par exemple,Pop
a des effets secondaires et renvoie une valeur. que serait étrange de garder ces deux séparés.. (je n'aime pas l'idée de commandes et les requêtes, mais ce concept n'est pas appliquée .NET et pas toujours ce que vous voulez)Personnellement, je pense que le "oui" une partie de ma réponse s'applique toujours à la valeur retournée par
Add
, dans la grande majorité des cas d'utilisation.OriginalL'auteur RoadieRich
Ceux-ci sont appelés les méthodes d'extension, appel
new List<T>().RemoveAndGetItem(0)
.Choses à prendre en compte dans la méthode d'extension
La gestion des exceptions avec l'index que vous passez, vérifier que l'index est a 0 et le nombre de la liste avant de le faire.
Il n'y a aucune spécification quant à ce qui devrait se produire si vous passez un index non valide pour une méthode sur IList, donc je pense que c'est mieux de laisser l'argument de la validation de la liste de mise en œuvre. Pour tous vous le savez, une coutume IList la mise en œuvre pourrait être la attendre en dehors de la plage des indices pour quelque raison que ce soit.
c'est la raison exacte pour laquelle je l'ai dit c'est
something to consider
. Aussi, ce possiblité pourrait une liste personnalisée s'attendre à un indice qui est hors de portée, hors de la curiosité?Une liste qui s'affiche à l'envelopper de manière cyclique, par exemple? Qui sommes-nous pour assumer tous les programmeurs sont sane, ou que ce qui semble la folie n'est pas vraiment de profondeur de génie?
OriginalL'auteur LukeHennerley