9
votes

Jeter une hache .Keys dans la liste ou autre iEnumerable

Je sais, j'ai d'autres options, par ex. Je pourrais conserver une liste séparée de clés. S'il vous plaît ne suggérez pas d'autres options. Je veux simplement savoir si je peux retirer ça. S'il vous plaît ne me demandez pas quel problème j'essaye de résoudre ou de quoi que ce soit comme ça. Ceci est une question pure et simple CS.

Je veux savoir si quelqu'un sait un moyen de prendre les clés d'un hashtable code> et de les jeter dans une liste code> ou un autre type de iEnumerable code> (donné que mes clés sont en fait des entiers). P>

donné que je peux le faire sans problème: p> xxx pré>

Pourquoi cela me donne-t-il des erreurs? p>

(List<int>)hashtable.Keys


0 commentaires

6 Réponses :


0
votes

parce que hashtable.keys est une collection d'objets qui n'est pas covariant avec une liste d'entiers.


1 commentaires

Si nous allons diviser les cheveux, la covariance n'est pas explicitement nécessaire; La convertibilité est.



21
votes

Si vous avez des méthodes d'extension LINQ disponibles, vous pouvez effectuer les suivants ..

List<int> keys = hashtable.Keys.OfType<int>().ToList();


4 commentaires

+1. La raison spécifique étant que clés est un icollection , qui implémente uniquement ienumerable , pas ienumerable .


Notez également que, étant donné que l'OP demande "autre ienumerable ", "Vous pouvez renoncer au tolist et simplement taper la variable comme ienumerable (ou var ).


@Adam Robinson Bon appel, Merci également d'avoir ajouté votre explication, je suis sur une connexion de mauvaise qualité pour le moment et je suis en train de modifier ma réponse est légèrement douloureuse pour que je puissiez reporter à vos commentaires pour plus d'informations.


Merci! J'interrète mal la description de la méthode Cast () . Pour une raison quelconque, je pensais que le paramètre type devait être le type de collection plutôt que le type d'élément. Ma faute pour ne pas lire! :)



-1
votes

Votre foreach LOOP lancera un InvalidCastException si la collection ne contient pas de int .

La distribution à Liste échoue car le compilateur ne peut pas convertir un icollection non générique à un icollection


1 commentaires

La distribution échoue car les clés ne sont pas un type qui peut être utilisé comme s'il s'agissait d'une liste; C'est une ICOLLection, une interface très basique qui n'expose pas les méthodes disponibles sur une liste.



2
votes

parce que foreach code> nécessite hashtable.keys code> pour être un iEnumerable code>, lequel il est. Cependant, hashtable.Keys code> n'est pas une liste code>; C'est une icollection simple, qui n'est pas la même. Pour la convertir en une liste, essayez une liste LINQ:

List<int> keys = hashtable.Keys.OfType<int>().ToList();


2 commentaires

foreach nécessite ienumerable , pas ienumerable .


Techniquement oui, mais si cela est entièrement tapé fortement, vous devez définir la variable de l'article comme étant de ce type (ou quelque chose qu'il peut être implicitement lancé à); Vous obtiendrez une erreur de compilateur si vous essayez de faire quelque chose comme foreach (int ID dans mycollectionofreferenceyTypes)



0
votes

Vous pouvez faire icollection keycols = hashtable.keys.keys;


0 commentaires

0
votes

Utilisez le dictionnaire au lieu de la version non générique. Ou utiliser la méthode de l'extension Castto. Voir http://msdn.microsoft.com/en-us/ Bibliothèque / system.collections.icollection.aspx Pour plus de détails sur la collection non générique renvoyée par Hastable.Key aussi bien que le lien vers la méthode de casting que vous pouvez utiliser.


0 commentaires