Нужен хэштабл и аррайлист - PullRequest
10 голосов
/ 16 февраля 2011

Я пытаюсь использовать чужие классы C # в своем приложении для Windows 7 Phone.Классы используют объекты типа Hashtable.

Файл, о котором идет речь, имеет

using System.Collections;

вверху, поэтому я предполагаю, что это объект Hashtable, который он хочет.

Когда я пытаюсь построить свое решение, я получаю ошибки, из-за которых тип или имя пространства имен 'Hashtable' не может быть найдено, если вы пропустили директиву using или ссылку на сборку.

В документации Microsoftиз Hashtable я вижу, что там написано Assembly: mscorlib

Но если я пытаюсь добавить mscorlib через Project> Add Reference, VS говорит, что не может добавить его, потому что на него автоматически ссылается система сборки.

Чего мне не хватает?

Ответы [ 5 ]

27 голосов
/ 16 февраля 2011

Неуниверсальные коллекции, в том числе ArrayList и HashTable, не включены в Silverlight.
Эти классы являются отложениями из .Net 1.0 (у которых не было обобщений) и не должны использоватьсяв новом коде.

Вместо этого следует использовать общие коллекции - List<T> и Dictionary<TKey, TValue>.

10 голосов
/ 16 февраля 2011

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

  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>.(предложено Хеноном)

2 голосов
/ 16 февраля 2011

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

Hashtable is not in Silverlight

But Dictionary is

1 голос
/ 16 февраля 2011

System.Collection является наследием первой версии .Net - без универсальных типов.

Для исправления вашего кода используйте класс Dictorany, который является хеш-таблицей в основе, и List, встроенный в ArrayList.

0 голосов
/ 24 сентября 2012

Это сработало для меня, изменив:

Hashtable для Dictionary<object, object>

NameValueCollection для Dictionary<object, object>

Другая проблема, с которой я столкнулся, заключается в том, что Encoding.ASCII также не определен, я отсортировал это с помощью функции stackoverflow, парень написал:

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

...