Вопрос

Итак, мне нужно какой -то способ реализации неисправностей сеть (Я думаю, что это правильный термин) в C#

Допустим, у меня есть следующие данные:

Foo1 <-> Bar1
Foo2 <-> Bar1
Foo2 <-> Bar2
Foo2 <-> Bar3
Foo3 <-> Bar2
Foo3 <-> Bar3

Как я бы внедрил что -то, что могло бы поддержать это?

Одним из способов сделать это было бы создать класс, содержащий Foo, и бар, и для моего примера у меня было 6 из них, с каждой возможной комбинацией, однако это удваивает данные.

С помощью этих данных мне нужно иметь возможность выполнять расчеты на FOO1 в зависимости от того, сколько баров тоже указывает, и сколько Foo's The Bar Toper также и т. Д. И т. Д.

Я не ищу ответа, я бы предпочел каким -то направлением, как это реализовать, может быть, даже несколько ссылок.

Это было полезно?

Решение

Вы в основном обрисовали на графике модель, традиционно считающуюся «узлами» и «краями». Но ценные бумаги/кредиты работают.

Есть два классических ответа на такие вещи.

Это зависит от того, какие вопросы вы хотите задавать свои данные, насколько эффективно вы хотите их сохранить, и насколько плотными являются ваши данные.

Если, скажем, 30% возможных отношений между ценными бумагами и кредитами существуют, то плотная структура данных определенно окупится. Просто держите большую матрицу: ценные бумаги на X. Кредиты на Y. (x, y) означает, что кредит существует.

Если набор не очень плотный, то вы начинаете использовать «Sparse Edge Dature. В зависимости от вашего приложения вы можете:

  1. У любого объекта S есть список его LS.{ S->L,L,L; S->L; S->L,L,L }. Анкет Очень легко найти соседей С, но трудно найти L

  2. У объектов есть список LS, LS имеет список S: (S->L,L,L а также L->S,S,S) Использует больше места, но дает вам оба направленных запроса.

  3. Хранить набор справедливости (S,L) пары. Довольно плохо, если вам в основном нужно спросить: «Это S и это связано?»

  4. Хранить список обоих S,L а также L,S И как -то указать это. Это то, что мы подразумеваем под тем, как «заставить вашу базу данных выполнять работу».

Смотрите также Структура данных для отношений

Другие советы

Что ж, не давая вам ответа, подумайте о том, что можно сделать с 2-мерными массивами, и думать о проблеме с точки зрения хранения информации о краях.

Для меня это пахнет проблемой реляционной базы данных. То, что вы описали,-это две таблицы с многими ко многим отношениям. Подходит ли этот ответ, будет очень зависеть от того, как на самом деле выглядят ваши данные. Предыдущее предложение о том, чтобы каждый объект содержал список другого объекта, является одним из способов, но давайте назовем лопату, это реляционная база данных. Рассмотрите возможность использования такой технологии, как Framework Entity или LINQ Ado.net, чтобы определить ваши данные как реляционную базу данных и использовать LINQ для запроса данных.

Вы упоминаете, что вы обеспокоены удвоением памяти. Опять же, это зависит от того, как выглядят ваши реальные данные, но если у вас нет огромных объемов данных, это, вероятно, не будет проблемой. Единственная потраченная память - пустая память. Используйте память, если она (а) облегчает проблему решить или (b) дает вам большую гибкость. Не оптимизируйтесь, если у вас нет проблемы с производительностью.

Каждый класс может иметь список типа другого. Вы не дублируете данные таким образом, если не используете типы значений. Перекрестные ссылки могут сделать для утечек памяти.

То, что сказал Джо, находится на правильном пути. У каждого займа будет список случаев безопасности, и каждая безопасность будет иметь список экземпляров кредита. Хитрость заключается в том, чтобы убедиться, что у вас никогда не было займа, которая считает, что это связано с безопасностью, но безопасность не согласна. Я бы посоветовал разрешить добавлять или удалить операции только в парах, чтобы они были сделаны параллельно. Я не вижу, как это вызвало бы утечки памяти, так как GC достаточно умный, чтобы справиться с этим. Ссылка, напротив, не может справиться с этим без некоторых уловок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top