Должен ли я использовать связанный список или список и как его сериализовать. - PullRequest
0 голосов
/ 06 сентября 2018

Это для c #

Я старый динозавр, пишу на 360 ассемблере с 70-х годов, пытаюсь написать материал для ПК. Попутно я заменяю свою старую, пишу сам, думая об использовании существующей инфраструктуры.

Вот что у меня сейчас. Два объекта, Система и Планета. Поле в Системе имеет указатель на следующую Систему, также есть вторая цепочка Систем, которые соответствуют текущим критериям выбора. Также у Системы есть указатель на Планету, а у Планеты есть указатель на следующую Планету. Планета также имеет цепочку всех планет.

Теперь вопросы. Должен ли я использовать списки и иметь C # обрабатывать все ссылки и т. Д. Я уверен, что 1 экземпляр объекта может быть в нескольких списках, поэтому я могу иметь 1 список всех систем и второй список выбранных систем. Плюс есть список планет в системе и еще один список всех планет.

Я также хочу сохранить этот беспорядок на диск. Я потратил некоторое время на изучение сериализации, и, похоже, он отлично справляется с сохранением всех экземпляров в списке, но все выходит из строя, когда вы хотите сериализовать несколько классов. Я что-то упустил, просто ответ «да» вернет меня к поиску или мне придется свернуть свое собственное?

Я не хочу примеров кода, просто осторожный шаг в том направлении, на которое я должен смотреть.

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Исходя из этого, я создам класс Системы, Планеты с одним-многими упоминаниями планет в Системе (список здесь). Чтобы избежать сильной связи между Системой и Планетой, можно взглянуть на схему «Цепочка ответственности».

Сохранение этих данных в базу данных можно сериализовать с помощью Json.Net (newtonsoft). SQL-сервер поддерживает непосредственное размещение массива 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; } }
}
0 голосов
/ 06 сентября 2018

Должен ли я использовать связанный список или список ...

Ответ зависит от того, что представляет ваш объект и как вы собираетесь его использовать. Например, если я представлял дома, и людей, которые живут в каждом доме; тогда я могу выбрать коллекцию из 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 имеет собрание людей. Так что я мог бы поместить свойство на House с именем People, типа List<Person>. И если бы мне нужно было добраться до дома, с которым был связан человек, у меня могло бы быть свойство на Person с именем House, типа House.

Я надеюсь, что эта структура Домов и Людей соответствует вашему сценарию с Системами и Планетами.

Возможно, также стоит посмотреть Когда мне следует использовать List против LinkedList

... и как его сериализовать.

Много в интернете, попробуйте эти ...

Как сериализовать список ?

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

Надеюсь, это поможет вам начать.

0 голосов
/ 06 сентября 2018

Я бы просто создал два класса, один из которых был System с List<Planet>, содержащим все его планеты, а другой - Planet, содержащий ссылку на его систему (если таковой требуется). Сами системы сохраняются в List<System>. Как и планеты, они могут содержать ссылку на своего родителя, чтобы иметь доступ к списку, но если им это не нужно, это нормально.

Сохранение этого материала должно состоять из трех строк кода с системой сериализации на ваш выбор, либо в текстовом, либо в двоичном формате (Json.Net, XML-материал .Net предоставляет, yaml, двоичный форматер ...).

Связанные списки не стоят реализации, они не так полезны, как динамические массивы (например, List<T> в System.Collections.Generic или Vector<T> в C ++), которые изменяют свой размер при необходимости, и это не так легко отслеживать. У них определенно есть приложения, но это не одно из них. IMO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...