Эффективный способ клонирования HashSet ?

Несколько дней назад я ответил на интересный вопрос о SO о HashSet . Возможное решение заключалось в клонировании хеш-набора, и в своем ответе я предложил сделать что-то вроде этого:

HashSet original = ...
HashSet clone = new HashSet(original);

Хотя этот подход довольно прост, я подозреваю, что он очень неэффективен: конструктор нового HashSet необходимо отдельно добавить каждый элемент из исходного хеш-набора, а проверить, нет ли его еще . Это явно пустая трата времени: поскольку исходная коллекция представляет собой ISet , она гарантированно не будет содержать дубликатов. Должен быть способ воспользоваться этим знанием ...

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

Итак, кто-то придумал умное решение для более эффективного клонирования хеш-набора?

(Обратите внимание, что этот вопрос чисто теоретически, мне не нужно делать это в реальной программе)

35
задан Community 23 May 2017 в 12:25
поделиться