c#2D自动展开式收藏

时间:2012-01-05 15:41:53

标签: c# collections set 2d abstraction

我正在寻找一个系列。

我需要能够像使用2D整数键一样添加元素,例如.Add(3, 4, element)。如果我在集合的范围之外添加我需要扩展的集合,这包括负面,虽然它可以有一个限制,例如Int16的范围将是好的。集合中的每个元素都可以具有相同的类型,但我需要指定它是什么,例如Set<type> s;

我还需要避免慢速操作,例如在查找元素时进行搜索,在添加到集合时性能不那么重要。

有没有人对使用什么方法或最好能为答案提供课程有任何想法。

3 个答案:

答案 0 :(得分:2)

如果您需要复合键,可以使用Dictionary<Tuple<T1,T2>, TItem>中的Tuple<T1,T2>类。

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 :(得分:1)

听起来你想要Dictionary<int, T>

答案 2 :(得分:1)

您可以通过将其数据存储在Set<T>类型的私有变量中来实现此Dictionary<int, Dictionary<int, T>>

然后您可以使用

进行存储
public void Add(int key1, int key2, T value)
{
    _storage[key1][key2] = value;
}