Нужен хэштабл и аррайлист

Я пытаюсь использовать чужие классы 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>,

У вас есть несколько вариантов:

  1. Измените ваш импорт на using System.Collections.Generic; и изменить каждое использование HashTable в Dictionary<> а также ArrayList в List<>,

  2. Вы могли бы иметь возможность сойти с рук:

    using HashTable = System.Collections.Generic.Dictionary<object, object>;
    using ArrayList = System.Collections.Generic.List<object>;
    Обратите внимание, что любой будущий сопровождающий будет ненавидеть вас за это.

  3. Но лучше реорганизовать код для правильного использования общих коллекций.

  4. Создать класс Hashtable в пространстве имен System.Collections, воплощать в жизнь IDictionary<object, object> направляя все на внутреннее Dictionary<object, object> и осуществить необходимые изменения в поведении (блокировка, недостающие ключи и т. д.); Создать ArrayList путем инкапсуляции List<object>, (предложено Хеноном)

Существуют разные mscorlibs в зависимости от того, какую платформу.NET вы используете. Если вы посмотрите в раскрывающемся списке "Другие версии" на странице MSDN, вы увидите Hashtable не является частью Silverlight. Вам нужно будет использовать Dictionary<Object, Object> (или в идеале более строго типизированные ключи и типы значений)

Hashtable отсутствует в Silverlight

Но словарь

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 ()));

Другие вопросы по тегам