Расширение контейнера HashSet<T>
От: this  
Дата: 22.02.17 11:34
Оценка:
Доброго времени суток!

Хочу добавить в HashSet<int> переменную, которая будет выполнять роль fill pointer'а.

Т.е. я хочу получить что-то наподобие этого:
public static class HashSetExtensions
{
    private int capacity;
    public static void capacity(this HashSet<int> hs, int capacity)
    {
        this.capacity = capacity;
    }

    public static int capacity(this HashSet<int> hs)
    {
        return this.capacity;
    }
}


Вопрос: какими путями я могу получить это в C#?
Re: Расширение контейнера HashSet<T>
От: Sinix  
Дата: 22.02.17 12:01
Оценка:
Здравствуйте, this, Вы писали:

T>Вопрос: какими путями я могу получить это в C#?


1. Создать свой HashSet<>
2. Залезть через рефлексию в внутренности HashSet и посмотреть размер m_buckets.
Ну, или (гулять так гулять) подсунуть свой сериализатор и посмотреть, что кладётся в слот "Capacity".

Менять не советую, см вот эту строчку:
            Contract.Assert(HashHelpers.IsPrime(newSize), "New size is not prime!");


А какая задача? В смысле, чего хочется при помощи capacity добиться?
Re[2]: Расширение контейнера HashSet<T>
От: this  
Дата: 22.02.17 12:29
Оценка:
Здравствуйте, Sinix, Вы писали:

S>А какая задача? В смысле, чего хочется при помощи capacity добиться?


Задача следующая: контейнеры с HashSet<int> часто передаются в разные функции и заполняются новыми значениями. Постоянно приходится таскать sizeSetA, sizeSetB, как параметры функций.
Например,
while (setA.Count < sizeSetA)
{
    int randNumber = rng.Next(-2 * sizeSetA, (2 * sizeSetB) + 2);
    setA.Add(randNumber);
}

Поэтому я решил, что лучше инкапсулировать одну переменную внутрь HashSet<int>, чтобы хранить в ней fill pointer. Так что через рефлексию смотреть размер m_buckets не вариант.
Re[3]: Расширение контейнера HashSet<T>
От: Sinix  
Дата: 22.02.17 12:34
Оценка:
Здравствуйте, this, Вы писали:

T>Задача следующая: контейнеры с HashSet<int> часто передаются в разные функции и заполняются новыми значениями. Постоянно приходится таскать sizeSetA, sizeSetB, как параметры функций.


Ну, тогда могу предложить extension-метод
void EnsureIsFilled<T>(this HashSet<T> set, int desiredCapacity, IEnumerable<T> fillSource) { ... }

— вариант раз,

Сделать свой класс PrefilledHashSet<T>:HashSet<T> с соответствующим методом — вариант два.
Re: Расширение контейнера HashSet<T>
От: vmpire Россия  
Дата: 22.02.17 13:42
Оценка: 1 (1)
Здравствуйте, this, Вы писали:

T>Т.е. я хочу получить что-то наподобие этого:

T>
T>public static class HashSetExtensions
T>{
T>    private int capacity;
T>    public static void capacity(this HashSet<int> hs, int capacity)
T>    {
T>        this.capacity = capacity;
T>    }

T>    public static int capacity(this HashSet<int> hs)
T>    {
T>        return this.capacity;
T>    }
T>}
T>


T>Вопрос: какими путями я могу получить это в C#?

Для такого расширения функциональности классов стандартный путь — это наследование.
Создайте свой потомок HashSet<>
Re[2]: Расширение контейнера HashSet<T>
От: Gattaka Россия  
Дата: 22.02.17 17:59
Оценка:
Здравствуйте, Sinix, Вы писали:

S>2. Залезть через рефлексию в внутренности HashSet и посмотреть размер m_buckets.

Вредный совет. Лучше уши себе отморозьте.
Re: Расширение контейнера HashSet<T>
От: Spinifex Россия https://architecture-cleaning.ru/
Дата: 22.02.17 18:05
Оценка: 1 (1) +1
Посмотрите в сторону C5. Может там уже сделано то что вам нужно: C5.HashSet&lt; T &gt;
Там много всякого и разного.
Re[2]: Расширение контейнера HashSet<T>
От: this  
Дата: 22.02.17 18:33
Оценка:
Здравствуйте, Spinifex, Вы писали:

S>Посмотрите в сторону C5. Может там уже сделано то что вам нужно: C5.HashSet&lt; T &gt;

S>Там много всякого и разного.

Пока что я реализовал наследование в стиле PrefilledHashSet
Как подключить C5 к проекту? Там реально сделано много из того, что мне нужно.
Re[3]: Расширение контейнера HashSet<T>
От: Sinix  
Дата: 22.02.17 18:41
Оценка:
Здравствуйте, Gattaka, Вы писали:

S>>2. Залезть через рефлексию в внутренности HashSet и посмотреть размер m_buckets.

G>Вредный совет. Лучше уши себе отморозьте.
Кэп
Re[4]: Расширение контейнера HashSet<T>
От: Gattaka Россия  
Дата: 22.02.17 18:44
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Gattaka, Вы писали:


S>>>2. Залезть через рефлексию в внутренности HashSet и посмотреть размер m_buckets.

G>>Вредный совет. Лучше уши себе отморозьте.
S>Кэп
Ну для тебя может и кэп. Но на форуме тусуют люди — не могут nuget подключить.
Re[5]: Расширение контейнера HashSet<T>
От: this  
Дата: 22.02.17 18:50
Оценка:
Здравствуйте, Gattaka, Вы писали:

G>Ну для тебя может и кэп. Но на форуме тусуют люди — не могут nuget подключить.


Уже подключил
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.