Fonte d'une table de hachage.Clés dans une Liste<int> ou autre IEnumerable<int>
Je sais, j'ai d'autres options, par exemple, j'ai pu maintenir une liste distincte des touches. Merci de ne pas proposer d'autres options. Je veux simplement savoir si je peux en sortir. S'il vous plaît ne me demandez pas ce problème, je vais essayer de résoudre, ou quelque chose comme ça. C'est un pur et simple CS question.
Je veux savoir si quelqu'un connaît un moyen de prendre les clés à partir d'un Hashtable
et les jeter dans un List<int>
ou d'un autre type de IEnumerable<int>
(compte tenu bien sûr que mes clés sont en fait des entiers).
Étant donné que je peux le faire sans problème:
foreach (int key in hashtable.Keys)
Pourquoi est-ce que me donner des erreurs?
(List<int>)hashtable.Keys
vous pouvez poster l'exception.
OriginalL'auteur Samo | 2011-03-08
Vous devez vous connecter pour publier un commentaire.
Si vous avez d'extension LINQ méthodes disponibles, vous pouvez effectuer les opérations suivantes..
Aussi
peut travailler en fonction automatique de boxe
Keys
est unICollection
, qui n'implémenteIEnumerable
, pasIEnumerable<T>
.Notez également que depuis l'OP demande "d'autres
IEnumerable<int>
," vous pouvez renoncer à laToList
et simplement le type de la variable queIEnumerable<int>
(ouvar
).Robinson Bon appel, aussi merci pour l'ajout de votre explication, je suis sur une mauvaise qualité de connexion en ce moment et modifier ma réponse est un peu douloureux je voudrais donc avoir l'OP reporter à vos commentaires pour plus d'informations.
Merci! J'ai été une mauvaise interprétation de la description de l'
Cast<T>()
méthode. Pour une raison que je pense que le paramètre type est le type de la collection plutôt que le type de l'élément. De ma faute pour ne pas la lecture! 🙂OriginalL'auteur Quintin Robinson
Parce que
foreach
nécessitehashtable.Keys
être unIEnumerable<TKey>
, qui il est. Cependant,hashtable.Keys
n'est PAS unList<TKey>
; c'est un simple ICollection, qui n'est pas le même. Pour la convertir en une Liste, essayez un peu de Linq:Ce sera essentiellement énumérer les Clés de la collecte et de l'ajout de chaque élément à une nouvelle Liste, puis vous en donner la Liste. OfType() est "plus sûr" que la Fonte; Cast essaie juste de traiter l'ensemble de la collection comme un
IEnumerable<int>
, ce qui peut entraîner des erreurs d'exécution ou d'un comportement imprévisible si tout élément contenu est nul ou ne peut pas être implicitement converti en un entier. OfType, en revanche, va parcourir la source et de produire une énumération de seulement les éléments qui sont réellement ints. Travaux que si vous êtes SÛR que toutes les clés sont des nombres entiers.foreach
nécessiteIEnumerable
, pasIEnumerable<T>
.Techniquement oui, mais si c'énumérable est fortement typé, vous devez définir la variable item comme étant de ce type (ou de quelque chose, il peut être implicitement converti à l'); vous obtiendrez une erreur de compilation si vous essayez de faire quelque chose comme
foreach(int id in MyCollectionOfReferenceTypes)
OriginalL'auteur KeithS
Parce que
hashtable.Keys
est une collection d'objets qui n'est pas covariante avec une liste d'entiers.OriginalL'auteur Vadim
Vous pouvez faire
ICollection<int> keyCols = hashtable.Keys;
OriginalL'auteur Kumar
Soit utiliser le Dictionnaire au lieu de non-générique. Ou utiliser CastTo méthode d'extension. Voir http://msdn.microsoft.com/en-us/library/system.collections.icollection.aspx pour plus de détails sur la non-générique de la collection retournée par Hastable.Clé et lien à la coulée de la méthode que vous pouvez utiliser.
OriginalL'auteur Alexei Levenkov
Votre
foreach
boucle va jeter unInvalidCastException
si leKeys
collection ne contient pas unint
.Le casting de
List<int>
échoue parce que le compilateur ne peut pas convertir un non-génériqueICollection
à unICollection<T>
OriginalL'auteur Bryan