c # 2D авто расширяемая коллекция - PullRequest
0 голосов
/ 05 января 2012

Я ищу коллекцию.

Мне нужно иметь возможность добавлять элементы, как если бы использовалась двумерная целочисленная клавиша, например .Add(3, 4, element).Если я добавляю за пределы диапазона коллекции, мне нужно расширить коллекцию, в том числе отрицательно, хотя она может иметь ограничение, например, диапазон Int16 будет хорошим.Каждый элемент в коллекции может иметь одинаковый тип, но мне нужно указать, что это, например, Set<type> s;

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

Есть ли у кого-нибудь какие-либо идеи о том, какой подход использовать, или лучше всего предложить класс в ответе.

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Если вы хотите составной ключ, вы можете использовать класс Tuple<T1,T2> в: Dictionary<Tuple<T1,T2>, TItem>.

var coll = new Dictionary<Tuple<int,int>, AnyClass>();
coll.Add(new Tuple<int,int>(2, 3), new AnyClass("foo"));
coll.Add(new Tuple<int,int>(4, 2), new AnyClass("bar"));

var foo = coll[new Tuple<int,int>(2,3)];
var bar = coll[new Tuple<int,int>(4,2)];

Если синтаксис слишком странный, вы можете обернуть класс следующим образом:

public class Dictionary2d<TKey1, TKey2, TItem> : Dictionary<Tuple<TKey1, TKey2>,TItem>
{
    public void Add(TKey1 k1, TKey2, TItem item) {
        this.Add(Tuple.Create(k1,k2), item);
    }

    public TItem this[TKey1 k1, TKey2 k2] {
        get { return this[Tuple.Create(k1,k2)]; }
    }
}

public class Program
{
    static void Main() {
        var coll = new Dictionary2d<int,int, AnyClass>();
        coll.Add(2, 3, new AnyClass("foo"));
        coll.Add(4, 2, new AnyClass("bar"));

        var foo = coll[2,3];
        var bar = coll[4,2];
    }
}

Преимущества использования класса Tuple состоят в том, что сравнение на равенство и хэш-код обрабатывается изначально, поэтому даже если это класс, два разных экземпляра кортежа с одинаковыми значениями будут считаться равными.

1 голос
/ 05 января 2012

Вы можете реализовать это Set<T>, сохранив его данные в закрытой переменной типа Dictionary<int, Dictionary<int, T>>.

Вы можете сохранить с помощью

public void Add(int key1, int key2, T value)
{
    _storage[key1][key2] = value;
}
1 голос
/ 05 января 2012

Звучит так, как будто вы хотите Dictionary<int, T>.

...