Нужна 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()));