Можно ли заполнить таблицу поиска во время компиляции? C # - PullRequest
4 голосов
/ 03 декабря 2010

У меня есть довольно большой Hashtable, заполненный поиском только статических данных.

Это означает, что при запуске программы у меня будет либо длинный метод инициализатора / конструктора, который будет выполнять много методов hashtable.Add () (yuk), либо десериализация из файла ресурсов, который япользовательский, сгенерированный во время кодирования.

Существует ли какой-либо атрибут или другой способ, которым я мог бы использовать эти данные для включения во время компиляции?

Ответы [ 5 ]

3 голосов
/ 03 декабря 2010

Если ваши данные строго статичны (или достаточно статичны, чтобы вы могли жестко закодировать их в своей программе), тогда вы можете просто поместить все свои значения в оператор switch.На самом деле не могу сказать, хорошая это идея или нет, но это выглядит не хуже, чем загрузка HashTable.С другой стороны, инициализация «хэш-таблицы» становится операцией строго времени компиляции:

public int Lookup(int key)
{
  switch (key)
  {
    case K1: return V1;
    case K2: return V2;
    case K3: return V3;
    case K4: return V4;
    case K5: return V5;
    case K6: return V6;
    case K7: return V7;
    default: return V_WHOOPS;
  }
}

Если число значений велико, вы можете написать сценарий для генерации кода, а не вводить его вот руки.

2 голосов
/ 03 декабря 2010

В зависимости от того, что у вас в таблице. Вы всегда можете использовать файл ресурсов.

http://msdn.microsoft.com/en-us/library/ekyft91f.aspx

1 голос
/ 03 декабря 2010

Нет способа концептуально настроить объект во время компиляции. Объект должен быть выделен / создан во время выполнения .NET, затем каким-либо образом заполнен данными.

Что касается того, как сделать это быстрее, вы можете попробовать сериализовать Hashtable в двоичный файл после того, как все медленные вызовы Add были сделаны на нем.

Тогда в вашем основном приложении вы можете просто сериализовать его обратно, когда оно понадобится.

Мы надеемся, что это даст вам более быструю инициализацию вашего HashTable, в отличие от многих .Add вызовов.

0 голосов
/ 03 декабря 2010

Если вы хотите экземпляр HashTable во время выполнения, вы должны выделить и заполнить этот экземпляр HashTable во время выполнения.

Если вы хотите принять решение со значением, вы можете написатьспособ.

0 голосов
/ 03 декабря 2010

Чтобы справиться с этим, если вы не хотите загружать Hashtable во время выполнения, это сохранить данные в базе данных, а затем выполнить поиск либо с помощью запросов, либо с помощью LINQ.Есть несколько вариантов: SQLLite , SqlServerCE , если вы просто хотите что-то ориентированное на рабочий стол.Вы также можете использовать что-то более надежное, например SqlServer или MySql, в зависимости от области применения.

...