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

C# 高效的数据模式,可存储三个相关项,便于访问,c#,C#,我在为word自动化项目设计存储书签元素的高效数据存储方法时遇到了一些问题。这是我需要做的。我需要将所有bookmarkstart和bookmarksend以及bookmark id存储在一个整洁的数据结构中,让我能够访问这三个对象中的任意一个,只要其中一个具有最低的运行时复杂性。例如,如果我不需要存储id,我可以制作一个字典,使用书签start作为键,使用书签end作为值,访问时间为O(1)。但是,是否有一个逻辑、简单和有效的结构,将这三项功能结合在一起 谢谢它被称为DTO: public c

我在为word自动化项目设计存储书签元素的高效数据存储方法时遇到了一些问题。这是我需要做的。我需要将所有bookmarkstart和bookmarksend以及bookmark id存储在一个整洁的数据结构中,让我能够访问这三个对象中的任意一个,只要其中一个具有最低的运行时复杂性。例如,如果我不需要存储id,我可以制作一个字典,使用书签start作为键,使用书签end作为值,访问时间为O(1)。但是,是否有一个逻辑、简单和有效的结构,将这三项功能结合在一起

谢谢

它被称为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;
var dict=newdictionary();
dict[bookmark.Id]=书签;
它被称为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;
var dict=newdictionary();
dict[bookmark.Id]=书签;

如果bookmark start和bookmark end都是零整数,则可以将它们存储在简单数组中。如果你使用字典,那么它不再是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];
当然,使用数组可能是最不灵活的,但将是最快的

如果不需要绝对速度,可以创建
列表
,并使用
查找
方法

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

如果bookmark start和bookmark end都是基于零的整数,则可以将它们存储在简单数组中。如果你使用字典,那么它不再是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];
当然,使用数组可能是最不灵活的,但将是最快的

如果不需要绝对速度,可以创建
列表
,并使用
查找
方法

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

您正在考虑为此实现一个定制的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 */
class BookmarkObj{/*类似于steven的*/}
类书签商店{
字典byId;
词典的起始日期;
字典字节日期;
/*无聊的初始化代码*/
公共作废插入(书签obj obj){
byId[obj.Id]=obj;
按开始日期[对象开始]=对象;
byEndDate[obj.End]=obj;
}
公共书签obj GetById(int-id){
返回byId[obj.Id];
}
/*等等*/
}

这个数据结构并没有真正映射到IDictionary,但如果迭代和契约对您来说很重要,您可以让它实现ICollection


如果O(1)查找不是很重要,您也可以将其实现为一个列表,并使用LINQ进行查找,从而简化您的生活。记住,过早优化是不好的。

您正在考虑为此实现一个定制的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 */
class BookmarkObj{/*类似于steven的*/}
类书签商店{
字典byId;
词典的起始日期;
字典字节日期;
/*无聊的初始化代码*/
公共作废插入(书签obj obj){
byId[obj.Id]=obj;
按开始日期[对象开始]=对象;
byEndDate[obj.End]=obj;
}
公共书签obj GetById(int-id){
返回byId[obj.Id];
}
/*等等*/
}

这个数据结构并没有真正映射到IDictionary,但如果迭代和契约对您来说很重要,您可以让它实现ICollection


如果O(1)查找不是很重要,您也可以将其实现为一个列表,并使用LINQ进行查找,从而简化您的生活。记住,过早优化是不好的。

在.Net中使用不是很好吗?在.Net中使用不是很好吗?问题是我需要存储多个书签对象。因此,如果我使用一个类来构造它们,我需要将它们存储在一个时间列表中,这意味着迭代它们是O(n)。问题是我需要存储多个bookmark对象。因此,如果我使用一个类来构造它们,我需要将它们存储在一个时间列表中,这意味着迭代它们是O(n)