高效的数据模式,可存储三个相关项目,便于访问

时间:2012-03-27 14:19:36

标签: c#

我在为一个自动化项目存储一些书签元素的高效数据存储方法方面遇到了一些麻烦。这是我需要做的。我需要将所有bookmarkstart和书签结束以及书签ID存储在一个整洁的数据结构中,这样我就可以访问这三个对象中的任何一个,其中一个对象的运行时间复杂度最低。例如,如果我不需要存储id,我可以只创建一个字典并使用书签start作为键,并将书签结束作为值以使访问时间为O(1)。但是,是否有一个合乎逻辑,简单而有效的结构来将所有这三个项目结合在一起具有这种功能?

由于

3 个答案:

答案 0 :(得分:2)

它被称为DTO:

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;

答案 1 :(得分: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);

答案 2 :(得分:0)

您正在考虑为此目的实现自定义的Map / Hash / Dictionary类。

基本上:

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)查找不是那么重要,你可以选择将它作为List实现并使用LINQ进行查找并简化你的生活。请记住,过早优化是不好的。