2012-01-05 13 views
0

私はコレクションを探しています。c#2Dオートエクスパンダブルコレクション

たとえば、.Add(3, 4, element)のように2D整数キーを使用しているかのように要素を追加できる必要があります。コレクションの範囲外に追加すると、コレクションを展開する必要がありますが、これには制限がありますが、負の値も含まれます。たとえば、Int16の範囲が良いとします。コレクション内のすべての要素は同じ型を持つことができますが、その要素を指定する必要があります。例えば、Set<type> s;

要素をルックアップするときの検索などの操作が遅くならないようにする必要があります。コレクションに追加する。

誰にどのようなアプローチを使用するかについてのアイデアはありませんか、そこではそのクラスに最善を尽くすことができますか。

+0

同じ「キー」値を複数回追加しますか?つまり、あなたはシナリオを取得しますか?(3、4)を追加し、(3、5)を追加して、たとえば、(3、6)を追加しますか?もしそうなら、辞書はT1値がユニークでなければならないので動作しません –

+0

申し訳ありません。私はそれを元に戻しました:¬P '.Add(3、4、element)' – alan2here

+0

あなたが望むのは、疎な行列コレクションです。あなたは 'Tuple 'と値のリストを使ってインデックスペアのリストを保持します。 – ja72

答えて

2

を使用することができます

は、あなたがで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]; 
    } 
} 

の利益、平等、ハッシュコード比較がネイティブに処理されるということですので、たとえそれはクラスであり、同じ値を持つタプルの2つの異なるインスタンスは等価と見なされます。

+0

これはすばらしく見えます:Â) – alan2here

+0

TContentの行がどのように動作し、コンパイルされないのか分かりません。私はそれがTItemであると思われると思う。 – alan2here

+0

あなたは正しいです。コードを更新しました。 –

1

Dictionary<int, T>のように聞こえます。

+0

(申し訳ありません、投稿した直後に質問を編集しました)辞書では、回答を検索する際にすべての要素が検索される必要がありますか? – alan2here

+0

辞書にはO(1)検索があります。 http://en.wikipedia.org/wiki/Hash_table – SLaks

+0

@ alan2hereいいえ、辞書はO(1)であるため、非常に効率的です。 –

1

Dictionary<int, Dictionary<int, T>>のプライベート変数にデータを格納することで、このSet<T>を実装できます。 Dictionary<Tuple<T1,T2>, TItem>:あなたは複合キーが必要な場合は、その後、店舗

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

内部辞書が存在することを確認する必要があります。 'TryGetValue'を使います。 – SLaks

+0

もちろん内部辞書が存在し、_storageはプライベート変数であり、Set クラスによって完全に管理されます。 –

+0

'_storage [key1]'が存在することを確認することを意味します – SLaks