【问题标题】:Should I use linked list or list and how do I serialize it.我应该使用链表还是列表以及如何序列化它。
【发布时间】:2018-09-05 21:30:24
【问题描述】:

这是为 c# 编写的

我是一只老恐龙,从 70 年代开始编写 360 汇编程序,尝试为 PC 编写东西。一路上,我正在用现有的基础设施替换我自己的旧写。

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

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

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

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

【问题讨论】:

  • 链表现在几乎只存在于学术书籍和采访中。至于序列化,您可以通过使用关键字c# serialization 向 google 询问您所需要的内容
  • 我们通常在 C# 中调用指针引用。如果你的系统到系统和行星到行星的关系只有父母和孩子,一个列表就可以了,如果你需要更复杂的关系,你可以轻松地创建你自己的包含父母和孩子列表的类。至于链表,正如@Steve 所说,它可能不需要,如果你需要的话,可以通过基类库链接列表类
  • 我认为您走在正确的轨道上,只需根据您的需要继续探索您的类,C# 中的序列化很容易开始工作,即使对于复杂的对象和列表也是如此。当您遇到特定问题时,请随时回来向我们展示
  • 我在几个项目中使用过链表。绝对有他们的位置。我完全不同意他们唯一的用途是学术。如果您的大多数列表修改都是添加/删除不在列表末尾的值并且您不需要随机访问,那么链表就很棒。
  • 感谢所有帮助。我和列表一起去了。使用提供的工具比强制解决方案更容易。我也有序列化工作。我花了一段时间,而且难度很大,因为我没有完全理解。我晚上试着写一个我是怎么做的,因为我在网上找不到任何符合我情况的东西,我能理解。现在一切正常,除了我将在一个新主题中提出的一点。

标签: c# serialization linked-list


【解决方案1】:

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

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

链表不值得实现,它们不如动态数组有用(如System.Collections.Generic 中的List<T> 或C++ 中的Vector<T>),它们会在需要时自行调整大小,但事实并非如此易于跟踪。他们肯定有应用程序,但这不是 IMO 之一。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    每个Househas-a 人的集合。所以我可能会在House 上放置一个名为People 的属性,类型为List<Person>。如果我需要前往与此人相关的房子,我可以在Person 上拥有一个名为House 的属性,类型为House

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

    或许也值得关注When should I use a List vs a LinkedList

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

    网上有很多,试试这些……

    How to Serialize List<T>?

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

    希望这有助于您入门。

    【讨论】:

      【解决方案3】:

      根据它的声音,我将创建 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; } }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-18
        • 2016-07-07
        • 2019-07-30
        • 2023-03-22
        • 2014-09-27
        • 1970-01-01
        • 2018-03-22
        • 2015-02-24
        相关资源
        最近更新 更多