2012-01-05 24 views
0

我正在尋找一個集合。c#2D自動展開收藏

我需要能夠像使用2D整數鍵一樣添加元素,例如.Add(3, 4, element)。如果我在集合的範圍之外添加集合,我需要集合進行擴展,但這包括負面的,儘管它可以有一個限制,例如Int16的範圍會很好。集合中的每個元素都可以具有相同的類型,但我需要指定它是什麼,例如Set<type> s;

我還需要避免緩慢操作,例如查找元素時進行搜索,當性能不太重要時添加到集合中。

有沒有人有任何想法,使用什麼方法或最好的可以提供類在那裏的答案。

+0

是否要多次添加相同的「鍵」值?即:你會得到的情景。添加(3,4)然後。添加(3,5),然後添加(3,6)?如果是這樣,字典將無法​​正常工作,因爲T1值必須是唯一的 – 2012-01-05 15:48:39

+0

對不起。我重新編寫了它:¬P'.Add(3,4,element)' – alan2here 2012-01-05 16:07:29

+0

你想要的是一個稀疏矩陣集合。你使用'Tuple '和一系列值來保存索引對列表。 – ja72 2012-01-05 16:13:34

回答

2

如果你想有一個複合鍵

,您可以使用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比較原生處理,所以即使它是一個類,具有相同值的元組的兩個不同實例將被視爲等於。

+0

這看起來不錯:¬) – alan2here 2012-01-05 16:17:07

+0

我看不到TContent行是如何工作的,它不會編譯。我認爲它應該是TItem。 – alan2here 2012-01-05 23:20:43

+0

你是對的。我更新了我的代碼。 – 2012-01-06 08:11:41

1

這聽起來像是你想要一個Dictionary<int, T>

+0

(對不起,我只是在發佈後編輯了我的問題)字典是否要求在查找答案時搜索所有元素? – alan2here 2012-01-05 15:45:03

+0

字典有O(1)查找。 http://en.wikipedia.org/wiki/Hash_table – SLaks 2012-01-05 15:46:24

+0

@ alan2here不,字典是O(1),所以它非常有效。 – 2012-01-05 15:47:32

1

您可以通過將其數據存儲在Dictionary<int, Dictionary<int, T>>類型的專用變量中來實現此Set<T>。然後,您可以使用店內

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

您需要檢查內部字典是否存在。使用'TryGetValue'。 – SLaks 2012-01-05 15:57:20

+0

當然內部字典存在,_storage是一個私有變量,完全由Set 類管理。 – 2012-01-05 15:58:30

+0

我的意思是確保'_storage [key1]'存在 – SLaks 2012-01-05 16:01:34