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



这是针对c#的

我是一个老恐龙,从70年代开始写360汇编程序,试图为PC写东西。一路上,我正在用现有的基础设施取代我以前自己写的东西。

这是我现在拥有的。两个物体,系统和行星。系统中的字段有一个指向下一个系统的指针,还有一个符合当前选择标准的第二个系统链。此外,系统有一个指向行星的指针,行星有一个指针指向下一个行星。行星也有一个所有行星的链。

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

我还想把这个烂摊子保存到磁盘上。我花了一些时间研究序列化,它似乎很好地保存了列表中的所有实例,但当你想序列化多个类时,事情就会崩溃。我是不是错过了一些基本的东西,只要一个"是"就会让我重新开始寻找,还是我必须自己滚动?

我不想要代码示例,只是朝着我应该看到的方向轻轻吐一口。

我只需创建两个类,一个是System,其中List<Planet>包含其所有行星,另一个是包含对其系统的引用(如果需要的话)的Planet。系统本身保存在List<System>中。就像行星一样,它们可以保存对其父母的引用,这样它们就可以访问列表,但如果它们不需要,那也没关系。

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

链表不值得实现,它们不如动态数组(如System.Collections.Generic中的List<T>或C++中的Vector<T>)有用,后者在需要时会自行调整大小,而且跟踪起来也不那么容易。他们显然有应用程序,但这不是其中之一

我应该使用链表还是列表

答案取决于你的物体代表什么以及你将如何使用它。例如,如果我代表的是房子,以及住在每栋房子里的人;那么我可能会选择具有CCD_ 8对象的集合。我使用集合作为一个通用术语:特别地,我可能会使用System.Collections.Generic命名空间中的List<T>(其中T可以表示任何类型,因此在这种情况下它将是List<House>),除非我需要更具体的东西,如Stack<T>Queue<T>Dictionary<T,U>等。

请注意,在这种方法中,每个House都不知道哪个房子是下一个,因为"下一个"的整个概念与房屋集合有关:每个单独的房子不需要知道它在集合中的位置,这是集合的责任。这是一个被称为"关注点分离"的设计原则。

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

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

除非您只计划按顺序访问数据,否则也有使用链表的性能原因。

每个House都有一群人。因此,我可以在House上放置一个名为People的属性,类型为List<Person>。如果我需要去那个人关联的房子,我可以在Person上拥有一处名为House的房产,类型为House

我希望《房屋与人》的结构与你的《系统与行星》场景相一致。

也许也值得一看我什么时候应该使用列表与LinkedList

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

互联网上有很多,试试这些。。。

如何序列化列表<T>?

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

希望这能帮助你开始。

根据它的声音,我将创建一个系统类,一个对多引用系统中行星的行星(在这里列出)。为了避免系统和星球之间的强耦合,可以考虑责任链模式。

将这些数据保存到数据库中,可以使用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; } }
}

相关内容

  • 没有找到相关文章

最新更新