c#2D自动可扩展集合

c#2D自动可扩展集合,c#,collections,set,2d,abstraction,C#,Collections,Set,2d,Abstraction,我在找一个收藏品 我需要能够像使用2D整数键一样添加元素,例如。添加(3,4,元素)。如果我在集合的范围之外添加,我需要集合扩展,这包括负面的,尽管它可能有一个限制,例如Int16的范围将是好的。集合中的每个元素可以彼此具有相同的类型,但我需要指定类型,例如Set s 我还需要避免缓慢的操作,例如在查找元素时进行搜索,而在添加到集合时,性能就不那么重要了 有没有人知道应该使用什么方法或最好的方法来提供类的答案。听起来你想要一个字典听起来你想要一个字典你可以通过将其数据存储在字典类型的私有变量中来

我在找一个收藏品

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

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


有没有人知道应该使用什么方法或最好的方法来提供类的答案。

听起来你想要一个
字典
听起来你想要一个
字典
你可以通过将其数据存储在
字典
类型的私有变量中来实现这个
集合

然后,您可以使用

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

您可以通过将其数据存储在类型为
Dictionary
的私有变量中来实现此
集合

然后,您可以使用

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

如果需要复合键,可以在:
字典中使用该类

var coll=newdictionary();
coll.Add(新元组(2,3),新AnyClass(“foo”);
coll.Add(新元组(4,2),新AnyClass(“bar”);
var foo=coll[新元组(2,3)];
var-bar=coll[新元组(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];
    }
}
公共类字典2d:Dictionary
{
公共作废添加(TKey1 k1、TKey1、TItem项目){
this.Add(Tuple.Create(k1,k2),item);
}
公共滴度本[TKey1 k1,TKey1 k2]{
获取{返回这个[Tuple.Create(k1,k2)];}
}
}
公共课程
{
静态void Main(){
var coll=新字典2d();
coll.Add(2,3,新的AnyClass(“foo”));
coll.Add(4,2,新的AnyClass(“bar”));
var foo=coll[2,3];
var bar=coll[4,2];
}
}

使用Tuple类的好处是,等式和hashcode比较是本机处理的,因此即使它是一个类,具有相同值的Tuple的两个不同实例也将被视为相等。

如果需要复合键,可以在:
字典中使用该类

var coll=newdictionary();
coll.Add(新元组(2,3),新AnyClass(“foo”);
coll.Add(新元组(4,2),新AnyClass(“bar”);
var foo=coll[新元组(2,3)];
var-bar=coll[新元组(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];
    }
}
公共类字典2d:Dictionary
{
公共作废添加(TKey1 k1、TKey1、TItem项目){
this.Add(Tuple.Create(k1,k2),item);
}
公共滴度本[TKey1 k1,TKey1 k2]{
获取{返回这个[Tuple.Create(k1,k2)];}
}
}
公共课程
{
静态void Main(){
var coll=新字典2d();
coll.Add(2,3,新的AnyClass(“foo”));
coll.Add(4,2,新的AnyClass(“bar”));
var foo=coll[2,3];
var bar=coll[4,2];
}
}


使用Tuple类的好处是,等式和hashcode比较是本机处理的,因此即使它是一个类,具有相同值的Tuple的两个不同实例也将被视为相等。

(抱歉,发布后我刚刚将内容编辑到我的问题中)字典是否要求在查找答案时搜索所有元素?@ALAN2此处为否,字典为O(1),因此非常有效。@ALAN2此处表示系统只能对每个元素执行一次查找(通常),而不是在列表上迭代。谢谢。我刚刚读了维基的文章,是的,它看起来很好。因此,我认为(忽略his中所需的额外抽象层)这是Roy Dictus答案的两倍,对吗?如果性能如此重要,请确保将字典的初始容量设置得足够大。否则,字典将不得不不断扩展,这会影响插入时间。(对不起,我在发布后刚刚将内容编辑到问题中)字典是否要求在查找答案时搜索所有元素?@ALAN2此处不,字典为O(1),因此非常有效。@ALAN2此处表示系统只能执行1次查找(通常)每个元素,而不是在列表上迭代。谢谢。我刚刚阅读了wiki文章,是的,它看起来很好。那么我这样想对吗(忽略his中需要的额外抽象层)这是Roy Dictus回答速度的两倍?如果性能如此重要,请确保将字典的初始容量设置为足够大。否则,字典将不得不不断扩展,这会影响插入时间。是否要多次添加相同的“键”值?即:您是否会得到该场景。然后添加(3,4)。添加(3,5)例如,添加(3,6)?如果是这样的话,字典将无法工作,因为T1值必须是唯一的对不起。我已经重写了它:,-P
。添加(3,4,元素)
您需要的是稀疏矩阵集合。您可以使用
元组保存索引对列表和值列表。如果您认为可以改进Steve B,请随时发布答案。是否要多次添加相同的“键”值?即:您是否会得到该场景。添加(3,4)然后添加(3,5)然后添加(3,6)例如?如果是这样的话,字典将不能工作,因为T1值必须是唯一的对不起。我已经重写了它:,-P
。添加(3,4,元素)
您需要的是一个稀疏矩阵集合。您可以使用
元组和值列表保存索引对列表。如果您认为可以改进Steve B,请随时发布答案。您需要检查内部字典是否存在。使用
TryGetValue
。当然,内部字典存在,存储是一个私有变量le并完全由Set类管理。我的意思是确保
\u存储[key1]
存在。您需要检查内部字典是否存在。使用
TryGetValue<