Самый быстрый способ создать список уникальных строк из цикла?

create table table_name(id int, name text, description text);
insert into table_name
values (1, 'John', 'big one');

select (id, name, description), id, name, description
from table_name;

        row         | id | name | description 
--------------------+----+------+-------------
 (1,John,"big one") |  1 | John | big one
(1 row)

Разница важна. Столбцы, заключенные в скобки, образуют конструктор строки , также известный как составное значение, возвращаемое в одном столбце. Обычно отдельные столбцы являются предпочтительными в качестве результата запроса. Конструкторы строк необходимы, когда нужна строка в целом (например, в VALUES вышеупомянутой команды INSERT). Они также используются в качестве значений составных типов.

5
задан Boris Callens 25 March 2009 в 10:40
поделиться

3 ответа

В первую очередь, используйте a Hashset<string> вместо списка, Содержит метод, пойдет быстрее:

int count = hits.Length();
Hashset<string> idStrings = new Hashset<string>();

Править: Вы не должны звонить, "Содержит", если Вы используете Hashset, поскольку он не может содержать дублирующиеся объекты. Просто использование Добавляет, оно автоматически удалит дублирующиеся значения.

13
ответ дан 18 December 2019 в 13:19
поделиться

Оператор, который замедляет Ваш код, idStrings.Contains(idString).

Можно попытаться использовать более быструю структуру данных, чем List (дерево или хеш-таблица, возможно?).

А именно, Вам нужна структура данных с подлинейным временем поиска. Хеш-таблицы имеют постоянное время поиска, в то время как деревья обычно имеют логарифмическое время поиска.

0
ответ дан 18 December 2019 в 13:19
поделиться

Используйте a Dictionary вместо a List. Dictionary.ContainsKey метод намного быстрее, чем List.Contains метод.

Dictionary<string, int> idStrings = new Dictionary<string, int>();
int count = hits.Length();
for (int i = 0; i < count; i++) {
   string idString = hits.Doc(i).Get("id");
   if (!idStrings.ContainsKey(idString)) {
      idStrings.Add(idString, 1);
   }
}

При использовании платформы 3.5, можно использовать a HashSet вместо a Dictionary:

HashSet<string> idStrings = new HashSet<string>();
int count = hits.Length();
for (int i = 0; i < count; i++) {
   string idString = hits.Doc(i).Get("id");
   idStrings.Add(idString);
}
1
ответ дан 18 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: