Нужен хэштабл и аррайлист
Я пытаюсь использовать чужие классы C# в своем приложении для Windows 7 Phone. Классы используют объекты типа Hashtable.
Файл, о котором идет речь, имеет
using System.Collections;
наверху, так что я предполагаю, что это объект Hashtable, который он хочет.
Когда я пытаюсь построить свое решение, я получаю ошибки, что тип или имя пространства имен 'Hashtable' не могут быть найдены, если вы пропустили директиву using или ссылку на сборку.
Я вижу, что в документации Microsoft по Hashtable написано Assembly: mscorlib
Но если я пытаюсь добавить mscorlib через Project>Add Reference, VS говорит, что не может добавить его, потому что на него автоматически ссылается система сборки.
Что мне не хватает?
5 ответов
Неуниверсальные коллекции, в том числе ArrayList
а также HashTable
, не включены в Silverlight.
Эти классы являются пережитками из.Net 1.0 (которые не имеют обобщений) и не должны использоваться в новом коде.
Вместо этого вы должны использовать общие коллекции -List<T>
а также Dictionary<TKey, TValue>
,
У вас есть несколько вариантов:
Измените ваш импорт на
using System.Collections.Generic;
и изменить каждое использованиеHashTable
вDictionary<>
а такжеArrayList
вList<>
,Вы могли бы иметь возможность сойти с рук:
using HashTable = System.Collections.Generic.Dictionary<object, object>;
using ArrayList = System.Collections.Generic.List<object>;
Обратите внимание, что любой будущий сопровождающий будет ненавидеть вас за это.Но лучше реорганизовать код для правильного использования общих коллекций.
Создать класс
Hashtable
в пространстве именSystem.Collections
, воплощать в жизньIDictionary<object, object>
направляя все на внутреннееDictionary<object, object>
и осуществить необходимые изменения в поведении (блокировка, недостающие ключи и т. д.); СоздатьArrayList
путем инкапсуляцииList<object>
, (предложено Хеноном)
Существуют разные mscorlibs в зависимости от того, какую платформу.NET вы используете. Если вы посмотрите в раскрывающемся списке "Другие версии" на странице MSDN, вы увидите Hashtable
не является частью Silverlight. Вам нужно будет использовать Dictionary<Object, Object>
(или в идеале более строго типизированные ключи и типы значений)
System.Collection является наследием первой версии.Net - без универсальных типов.
Чтобы исправить ваш код, используйте класс Dictorany, который является хеш-таблицей в основе, и List, встроенный в ArrayList.
Это сработало для меня, изменив:
Hashtable для Dictionary<object, object>
NameValueCollection для Dictionary<object, object>
Другая проблема, с которой я столкнулся, заключается в том, что Encoding.ASCII также не определен, я отсортировал эту функцию с помощью stackru
public static byte[] StringToAscii(string s) {
byte[] retval = new byte[s.Length];
for (int ix = 0; ix < s.Length; ++ix) {
char ch = s[ix];
if (ch <= 0x7f) retval[ix] = (byte)ch;
else retval[ix] = (byte)'?';
}
return retval;
}
кредиты здесь:
ASCIIEncoding в Windows Phone 7
Итак, наконец, чтобы вернуть ASCII, это то, что нужно сделать:
return StringToAscii (Encoding.Unicode.GetString (result.ToArray ()));