c#2D自动扩展集合

本文关键字:集合 扩展 c#2D | 更新日期: 2023-09-27 18:19:36

我正在寻找一个集合。

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

我还需要避免诸如在查找元素时进行搜索之类的缓慢操作,在添加到集合时性能就不那么重要了。

有没有人知道该使用什么方法,或者最好能为课堂提供答案。

c#2D自动扩展集合

如果您想要一个复合键,您可以在一个: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类的好处是,等式和哈希代码比较是本地处理的,因此即使它是一个类,具有相同值的元组的两个不同实例也将被视为相等。

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

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

然后您可以使用进行存储

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