Как получить строку на один столбец быстрее в C #? - PullRequest
0 голосов
/ 10 мая 2010

У меня есть DataTable со столбцом Value и столбцом Name, который имеет 30000 строк. Теперь я хотел бы получить очень быстрое Имя из строки, которую указал Значение. Как сделать это быстро? У меня около 40000 запросов с различными значениями в этой таблице.

Меня интересует решение в C # и , а не на стороне базы данных.

Ответы [ 6 ]

3 голосов
/ 10 мая 2010

Вы можете использовать DataView и установить порядок сортировки для ключа. Это приведет к созданию индекса в памяти.

Однако если это просто простой набор данных, содержащий только ключ и значение, я бы рекомендовал вместо него использовать Dictionary или HashTable. Вы получите намного лучшую производительность со словарем (в ходе тестирования мы загрузили миллионы элементов в словарь и получили поиск за секунду) - производительность для поиска составляет либо O (1), либо O (logn), я могу ' не помню, какой - в любом случае, это безумно быстро.

3 голосов
/ 10 мая 2010

Откуда поступают данные из таблицы данных? Всегда гораздо быстрее выполнять фильтрацию на стороне базы данных, чем извлекать всю таблицу базы данных в таблицу данных и затем фильтровать ее. Это на несколько порядков быстрее в базе данных.

3 голосов
/ 10 мая 2010

Предполагая, что у вас уже есть DataTable, вы можете сделать:

DataRows row = MyDataTable.Select("Value = 7")[0];
string name = (string)row["name"];

Конечно, если вы извлекаете DataTable только для этой цели, лучше выбрать только те данные, которые вам нужны, из базы данных. Если это данные, которые вы храните в памяти, я рекомендую вам воспользоваться предложением JMarsch по использованию словаря.

1 голос
/ 10 мая 2010

В .Net DataTables являются дорогими структурами.Более простая и эффективная конструкция - это Словарь.Вы можете определить его так:

    System.Collections.Generic.Dictionary<string, string> nameValueList = new Dictionary<string, string>();

, а затем загрузить его так:

nameValueList.Add("name1", "value1");

... при условии, что имена уникальны, в противном случае вы получитеArgumentException.И, наконец, вы можете вызвать такие значения:

string res = nameValueList["name1"];

Я думаю, что это одна из самых быстрых реализаций, если количество ожидаемых транзакций оправдывает первоначальные издержки преобразования ваших данных.

1 голос
/ 10 мая 2010

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

  1. Используйте DataView

    DataView view = new DataView(table);
    view.Sort = "Value asc";
    int index = view.Find(value);
    // you now have the index of the row in question, or -1 if it was not found
    
  2. Используйте Dictionary. Это будет несколько быстрее, но требует больше предварительной работы и технического обслуживания. Предполагая, что Value является целочисленным столбцом, а Name является строкой,

    Dictionary<int, string> lookup = table.Rows.ToDictionary(
        r => (int)r["Value"], 
        r => (string)r["Name"]);
    string name = lookup[value];
    

    Или, если могут быть значения, которых не существует,

    string name;
    if(lookup.TryGetValue(value, out name)) ...
    

Обе эти опции будут довольно быстрыми, хотя Dictionary, скорее всего, будет быстрее. Единственным недостатком является то, что вам нужно будет синхронизировать его со своей таблицей по мере внесения изменений (при условии, что изменения могут иметь место).

Очевидно, что самой базе данных проще выполнять эту фильтрацию, но я оставлю решение относительно того, следует ли делать это на стороне клиента.

1 голос
/ 10 мая 2010

НЕ используйте DataTable - нажмите на базу данных с запросом. Шутки в сторону. Вам нужно что-то с индексом, оптимизированным для работы с небольшими объемами данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...