我应该使用链表还是链表以及如何序列化它。

时间:2018-09-05 21:30:24

标签: c# serialization linked-list

这是针对c#

我是一个古老的恐龙,自70年代以来就开始编写360汇编程序,试图为PC编写东西。在此过程中,我将用现有的基础结构替换旧的自己写的东西。

这就是我现在所拥有的。两个对象,系统和行星。 System中的一个字段具有指向下一个System的指针,还有第二个满足当前选择标准的System链。系统还具有指向Planet的指针,Planet具有指向下一行星的指针。行星也有所有行星的链。

现在是问题。我应该使用列表并让C#处理所有链接等。我非常确定1个对象实例可以位于多个列表中,因此我可以拥有所有系统的一个列表和所选系统的第二个列表。另外,在系统中还有一个行星列表,以及所有行星的另一个列表。

我也想将此混乱保存到磁盘。我花了一些时间研究序列化,它似乎非常适合将所有实例保存在列表中,但是当您要序列化多个类时,事情就崩溃了。我是否缺少一些基本的知识,只是选择是,就会使我回到寻找的状态,还是我必须自己动手做?

我不需要代码示例,只是我应该关注的方向上的一些温和的练习。

3 个答案:

答案 0 :(得分:0)

我将简单地创建两个类,一个是"updateDataPost a" "updateDataBasic a" "updateDataPost b" "updateDataBasic b" "updateDataPost c" "updateDataBasic c" ,其中一个System包含其所有行星,另一个是List<Planet>,其中包含对他的系统的引用(如果一个是必须的)。系统本身保存在Planet中。像行星一样,它们可以引用其父级,因此可以访问该列表,但是如果不需要,可以这样做。

保存这些东西应该是三行代码,您可以选择文本或二进制的序列化系统(Json.Net,.Net提供的Xml东西,yaml,二进制格式化程序...)。

链接列表不值得实现,它们不如动态数组(例如List<System>中的List<T>或C ++中的System.Collections.Generic)有用,它们会在需要时自动调整大小,而且它们也不容易跟踪。他们肯定有申请,但这不是IMO之一。

答案 1 :(得分:0)

根据它的声音,我将创建System,Planet类,并在System中列出行星的一对多引用(在此处列出)。为了避免系统与行星之间的强耦合,可以查看“责任链”模式。

将此数据保存到数据库中可以使用Json.Net(newtonsoft)进行序列化。 SQL Server支持直接放置json数组。

伪代码:

class Planet {
  public Planet(System system) {System = system;}
  public System System {get; private set;} // singleton
}

class System {

  public Planet Planet {get; set;}

  // list of planets
  private List<Planet> planets = new List<Planet>();
  public List<Planet> Planets { get {return planets; } }
}

答案 2 :(得分:0)

我应该使用链接列表还是列表...

答案取决于您的对象代表什么以及如何使用它。例如,如果我代表房屋,以及每个房屋的居民;那么我可能会选择拥有House个对象的集合。我在那里使用 collection 作为通用术语:具体来说,我可能会使用List<T>命名空间中的System.Collections.Generic(其中T可以表示任何类型,所以它将是一个List<House>,除非我需要更具体的内容,例如Stack<T>Queue<T>Dictionary<T,U>

请注意,在这种方法中,每个House都不知道哪栋房子是下一个,因为整个“下一个”的概念与房子的收藏:每个房子都不需要知道它在收藏中的位置-这是收藏的责任。这是一种称为“关注点分离”的设计原则。

例如,如果我想创建House对象的不同集合(例如,前门为红色的对象),则可以通过创建一个新集合来实现此目的,并引用 House对象;而使用提到的对象引用下一个对象的方法,我将不得不创建一个不同的House对象,因为在这两个集合中 next 值将有所不同。

使用List<T>可使您专注于编写类,而不必编写集合的实现。

出于性能方面的原因,除非您仅打算按顺序访问数据,否则不要使用链接列表。

每个House has-a个人集合。因此,我可以在House上放置一个名为People的属性,类型为List<Person>。而且,如果我需要去与该人关联的房屋,则可以在Person上拥有一个名为House的财产,类型为House

我希望“房屋和人员”的这种结构与您使用“系统和行星”的方案相对应。

也许也值得一看When should I use a List vs a LinkedList

...以及如何序列化它。

大量的Internet上,尝试这些...

How to Serialize List<T>?

https://www.thomaslevesque.com/2009/06/12/c-parentchild-relationship-and-xml-serialization/

希望这有助于您入门。