Нужна Hashtable и Arraylist
Я пытаюсь использовать другие классы С# в своем приложении Windows 7 Phone. Классы используют объекты типа Hashtable.
Этот файл имеет
using System.Collections;
наверху, поэтому я предполагаю, что объект Hashtable, который он хочет.
Когда я пытаюсь создать свое решение, я получаю ошибки, что имя типа или пространства имен "Hashtable" не удалось найти, вы не указали ссылку на директиву или сборку.
В документации Microsoft по Hashtable, я вижу, что это сборка: mscorlib
Но если я попытаюсь добавить mscorlib через Project > Add Reference, VS говорит, что он не может добавить его, потому что он автоматически ссылается на систему сборки.
Что мне не хватает?
Ответы
Ответ 1
Не общие коллекции, включая ArrayList
и HashTable
, не включены в Silverlight.
Эти классы хранятся с .Net 1.0 (у которых нет дженериков) и не должны использоваться в новом коде.
Вместо этого вы должны использовать общие коллекции — List<T>
и Dictionary<TKey, TValue>
.
Ответ 2
У вас есть несколько вариантов:
-
Измените свой импорт на 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>
. (предположил хенон)
Ответ 3
В зависимости от используемой среды .NET существуют разные mscorlib. Если вы посмотрите в раскрывающемся списке "Другие версии" на странице MSDN, вы увидите, что Hashtable
не является частью Silverlight. Вам нужно будет использовать Dictionary<Object, Object>
(или, в идеале, более строго типизированные ключи и типы значений)
![Hashtable is not in Silverlight]()
![But Dictionary is]()
Ответ 4
System.Collection является наследием первой версии .Net - нет общих типов.
Чтобы исправить ваш код, используйте класс Dictorany, который является хэш-таблицей в глубине души,
и List insted из ArrayList.
Ответ 5
Это сработало для меня:
Hashtable для Dictionary<object, object>
NameValueCollection для Dictionary<object, object>
Другая проблема, с которой я столкнулся, - это Encoding.ASCII тоже не определена, я отсортировал ее с помощью функции stackoverflow lad написал:
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()));