Приведите хеш-таблицу. Ключи в Список <int>или другой IEnumerable <int> - PullRequest
10 голосов
/ 08 марта 2011

Я знаю, у меня есть другие варианты, например, Я мог бы вести отдельный список ключей. Пожалуйста, не предлагайте другие варианты. Я просто хочу знать, смогу ли я справиться с этим. Пожалуйста, не спрашивайте меня, какую проблему я пытаюсь решить, или что-нибудь в этом роде. Это чистый и простой вопрос CS.

Я хочу знать, знает ли кто-нибудь о способе взять ключи от Hashtable и привести их к List<int> или к другому типу IEnumerable<int> (учитывая, конечно, что мои ключи на самом деле целые) .

Учитывая, что я могу сделать это без проблем:

foreach (int key in hashtable.Keys)

Почему это дает мне ошибки?

(List<int>)hashtable.Keys

Ответы [ 6 ]

18 голосов
/ 08 марта 2011

Если у вас есть доступные методы расширения LINQ, вы можете сделать следующее ..

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

Также

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

может работать в зависимости от автоматического бокса

1 голос
/ 08 марта 2011

Потому что foreach требует, чтобы hashtable.Keys было IEnumerable<TKey>, что и есть.Тем не менее, hashtable.Keys НЕ является List<TKey>;это простая коллекция ICollection, которая не совпадает.Чтобы преобразовать его в список, попробуйте несколько Linq:

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

. Это, в основном, будет перечисляться через коллекцию ключей и добавит каждый элемент в новый список, а затем даст вам список.OfType () "безопаснее", чем Cast;Cast просто пытается обработать всю коллекцию как IEnumerable<int>, что может привести к ошибкам во время выполнения или непредсказуемому поведению, если какой-либо содержащийся элемент является нулевым или не может быть неявно приведен к целому числу.OfType, напротив, будет перебирать исходный код и производить перечислимые только те элементы, которые на самом деле являются целочисленными.Либо работает, если вы уверены, что все ключи являются целыми числами.

0 голосов
/ 08 марта 2011

Либо используйте словарь вместо неуниверсальной версии. Или используйте метод расширения CastTo. См. http://msdn.microsoft.com/en-us/library/system.collections.icollection.aspx для получения подробной информации о неуниверсальной коллекции, возвращаемой Hastable.Key, а также ссылку на метод приведения, который вы можете использовать.

0 голосов
/ 08 марта 2011

Вы можете сделать ICollection<int> keyCols = hashtable.Keys;

0 голосов
/ 08 марта 2011

Ваш цикл foreach выдаст InvalidCastException, если коллекция Keys не содержит int.

Приведение к List<int> завершается неудачно, поскольку компилятор не может преобразовать неуниверсальный ICollection в конкретный ICollection<T>

0 голосов
/ 08 марта 2011

Потому что hashtable.Keys - это набор объектов, который не ковариантен со списком целых чисел.

...