Несколько дней назад я ответил интересный вопрос на SO о HashSet<T>
. Возможное решение заключалось в клонировании хешета, и в моем ответе я предложил сделать что-то вроде этого:
HashSet<int> original = ...
HashSet<int> clone = new HashSet<int>(original);
Хотя этот подход довольно прост, я подозреваю, что он очень неэффективен: конструктору нового HashSet<T>
необходимо отдельно добавить каждый элемент из исходного хэшета, а проверить, если он еще не присутствует. Это, очевидно, пустая трата времени: поскольку исходный сборник ISet<T>
, он не содержит дубликатов. Должен быть способ воспользоваться этими знаниями...
В идеале HashSet<T>
должен реализовывать ICloneable
, но, к сожалению, это не так. Я также проверил Reflector, чтобы увидеть, что конструктор HashSet<T>
сделал что-то конкретное, если исходная коллекция была hashset, но это не так. Вероятно, это можно было бы сделать, используя отражение в частных полях, но это было бы уродливым взломом...
Итак, кто-то придумал умное решение для более эффективного клонирования хешета?
(Обратите внимание, что этот вопрос является чисто теоретическим, мне не нужно делать это в реальной программе)