我正在尋找一個集合。c#2D自動展開收藏
我需要能夠像使用2D整數鍵一樣添加元素,例如.Add(3, 4, element)
。如果我在集合的範圍之外添加集合,我需要集合進行擴展,但這包括負面的,儘管它可以有一個限制,例如Int16的範圍會很好。集合中的每個元素都可以具有相同的類型,但我需要指定它是什麼,例如Set<type> s;
我還需要避免緩慢操作,例如查找元素時進行搜索,當性能不太重要時添加到集合中。
有沒有人有任何想法,使用什麼方法或最好的可以提供類在那裏的答案。
我正在尋找一個集合。c#2D自動展開收藏
我需要能夠像使用2D整數鍵一樣添加元素,例如.Add(3, 4, element)
。如果我在集合的範圍之外添加集合,我需要集合進行擴展,但這包括負面的,儘管它可以有一個限制,例如Int16的範圍會很好。集合中的每個元素都可以具有相同的類型,但我需要指定它是什麼,例如Set<type> s;
我還需要避免緩慢操作,例如查找元素時進行搜索,當性能不太重要時添加到集合中。
有沒有人有任何想法,使用什麼方法或最好的可以提供類在那裏的答案。
如果你想有一個複合鍵
,您可以使用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];
}
}
使用元組類的好處,是平等和hashCode比較原生處理,所以即使它是一個類,具有相同值的元組的兩個不同實例將被視爲等於。
您可以通過將其數據存儲在Dictionary<int, Dictionary<int, T>>
類型的專用變量中來實現此Set<T>
。然後,您可以使用店內
public void Add(int key1, int key2, T value)
{
_storage[key1][key2] = value;
}
是否要多次添加相同的「鍵」值?即:你會得到的情景。添加(3,4)然後。添加(3,5),然後添加(3,6)?如果是這樣,字典將無法正常工作,因爲T1值必須是唯一的 –
2012-01-05 15:48:39
對不起。我重新編寫了它:¬P'.Add(3,4,element)' – alan2here 2012-01-05 16:07:29
你想要的是一個稀疏矩陣集合。你使用'Tuple'和一系列值來保存索引對列表。 –
ja72
2012-01-05 16:13:34