2012-03-27 5 views
1

ワード自動化プロジェクト用のブックマーク要素を効率的に格納する方法を設計するのに少し問題があります。ここで私は何をする必要があります。私は、すべてのbookmarkstartとブックマークの終わりを取得する必要があり、ブックマークIDは、私はこれらの3つのオブジェクトのいずれかにアクセスすることができますきちんとしたデータ構造に格納されて、たとえば、私はidを格納する必要がない場合、私は辞書を作って、キーとしてブックマークの開始を使用し、O(1)のアクセス時間を持つ値としてブックマークを終了することができます。しかし、これらのアイテムの3つすべてが一緒に結合されたこの機能を持つためには、論理的でシンプルで効率的な構造がありますか?これは、DTOと呼ばれる簡単なアクセスのために3つの関連項目を保存するための効率的なデータパターン

おかげ

+1

.NETで['Boost.MultiIndex'](http://www.boost.org/doc/libs/1_49_0/libs/multi_index/doc/index.html)を持っているのは素晴らしいことではありませんか? – Oliver

答えて

0

この目的のためにカスタマイズされたマップ/ハッシュ/ディクショナリクラスを実装しています。

基本的には:

class BookmarkObj { /* similar to steven's */ } 
class BookmarkStore { 
Dictionary<int, BookmarkObj> byId; 
Dictionary<DateTime, BookmarkObj> byStartDate; 
Dictionary<DateTime, BookmarkObj> byEndDate; 

/* Boring init code */ 

public void Insert(BookmarkObj obj) { 
    byId[obj.Id] = obj; 
    byStartDate[obj.Start] = obj; 
    byEndDate[obj.End] = obj; 
} 

public BookmarkObj GetById(int id) { 
    return byId[obj.Id]; 
} 

/* And so on */ 

}

このデータ構造は、実際のIDictionary上にマッピングされていないが、あなたは多分、反復あれば、それはICollectionをを実装して作ることができる、との契約はあなたにとって重要です。

O(1)ルックアップが重要ではない場合、代わりにこれをリストとして実装し、LINQを使用してルックアップを行い、あなたの人生を少し簡素化することができます。早すぎる最適化は悪いことを忘れないでください。

2

public class Bookmark 
{ 
    public int Id { get; set; } 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
} 

あなたは辞書で、それらのブックマークを保存することができます。

var dict = new Dictionary<int, Bookmark>(); 

dict[bookmark.Id] = bookmark; 
+0

問題は複数のブックマークオブジェクトを格納する必要があることです。だからクラスを作成するためにクラスを使用する場合は、それらを反復することを意味するいくつかの時間のリストに格納する必要がありますO(n) –

+0

辞書に保存することができます。 – Steven

2

ブックマーク開始とブックマークの終了が共にゼロベースの整数である場合には、それらを単純な配列に格納することができます。辞書を使用すると、それはもはやO(1)ではなく、それに非常に近いものです。

3つのフィールドを持つ基本オブジェクトを作成し、2つの配列を実際のデータのインデックスとして使用します。

public class Bookmark 
{ 
    public int ID { get; set; } 
    public int Start { get; set; } 
    public int End { get; set; } 
} 

    // setting up your bookmark indices 
    const int NumBookmarks = 200; 
    Bookmark[] startIndices = new Bookmark[NumBookmarks]; 
    Bookmark[] endIndices = new Bookmark[NumBookmarks]; 

    // add a new bookmark 
    Bookmark myBookmark = new Bookmark(){ID=5, Start=10, End=30}; 
    startIndices[myBookmark.Start] = myBookmark; 
    endIndices[myBookmark.End] = myBookmark; 

    // get a bookmark 
    Bookmark myBookmark = startIndices[10]; 

もちろん、配列を使用することはおそらく最も柔軟性がありませんが、最も高速になります。

絶対速度が必要ない場合は、Listを作成し、Findメソッドを使用できます。

Bookmark myBookmark = myBookmarks.Find(x=>x.Start==10); 
+0

bookmarkstartとbookmark endはxelementオブジェクトです –

関連する問題