Объявление хеш-таблицы с ключом, значением - PullRequest
5 голосов
/ 19 июля 2011

Я в C # 2.0.

Я хотел бы знать, возможно ли объявить Hashtable const, инициированный ключом и значениями. Я знаю, что это возможно с массивами:

public  static string[] ColumnsNames = 
{ "string1", "string2", "string3", "string4"
, "string5", "string6", "string7" };

но как мы можем сделать это с Hashtables.

Ответы [ 5 ]

9 голосов
/ 19 июля 2011

Это не может быть сделано в C # 2.0. Язык не поддерживает это. Спецификация языка здесь и нет упоминаний об инициализации встроенного словаря.

C # 3.0 допускает инициализацию словаря, аналогичную инициализации массива, которую вы описали в своем вопросе (спецификация языка здесь ). Вот пример:

var dictionary = new Dictionary<string, string> {
    {"key1", "value1"},
    {"key2", "value2"}
}; 
8 голосов
/ 19 июля 2011

Поверьте, это должно работать.

public Hashtable hash = new Hashtable()
{
  { "string1", 1 },
  { "string2", 2 }
}
8 голосов
/ 19 июля 2011

Это легко с C # 3 инициализаторами коллекции , которые все еще могут быть нацелены на .NET 2. Однако используя Dictionary<string, string> вместо Hashtable (не используйте неуниверсальный коллекции, если вам не нужно 1 ):

private static readonly Dictionary<string, string> Foo
    = new Dictionary<string, string>
{
    { "Foo", "Bar" },
    { "Key", "Value" },
    { "Something", "Else" }
};

Нет ничего похожего в C # 2, если вам действительно нужно это использовать. Вы действительно все еще используете Visual Studio 2005? Не забывайте, что вы все еще можете нацелиться на .NET 2 с C # 3 и 4 ...

РЕДАКТИРОВАТЬ: Если вы действительно хотите сделать это с помощью C # 2 и хеш-таблиц, вы можете написать статический метод, подобный этому:

public static Hashtable CreateHashtable(params object[] keysAndValues)
{
    if ((keysAndValues.Length % 2) != 0)
    {
        throw new ArgumentException("Must have an even number of keys/values");
    }
    Hashtable ret = new Hashtable();
    for (int i = 0; i < keysAndValues.Length; i += 2)
    {
        ret[keysAndValues[i]] = keysAndValues[i + 1];
    }
    return ret;
}

Тогда:

private static readonly Hashtable Foo = HashtableHelper.CreateHashtable(
    "key1", "value1", "key2", 10, "key3", 50);

Хотя я бы не советовал ...


1 Тот же синтаксис будет работать с Hashtable, если вы используете C # 3, но это действительно, действительно стоит использовать универсальные коллекции, если это возможно.

1 голос
/ 19 июля 2011

Вы имеете в виду

Dictionary<string, string> DDD = new Dictionary<string, string> { { "A", "B" }, { "X", "Y" }, { "Z", "A" } };
0 голосов
/ 28 июля 2017

Вы должны использовать Dictionary. В среднем Hastable примерно на 1/3 медленнее, чем Словарь (в основном из-за реализации). Далее он устарел .

...