C# 多对多关系

4

那么,我需要一种方法在C#中实现无向网络(我认为这是正确的术语)。

假设我有以下数据:

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

我该如何实现能够支持这一点的东西?
一种方法是创建一个包含Foo和Bar的类,对于我的示例,我将创建6个这样的类,每个可能的组合都有一个,但这会使数据翻倍。
使用这些数据,我需要能够根据它所指向的Bar的数量以及Bar所指向的Foo的数量等等对Foo1执行计算。
我不是在寻找答案,而是希望得到关于如何实现它的方向,甚至一些链接。

你能给我们一个真实世界的(非Foo/Bar)例子,说明您在应用程序中使用此结构的原因吗?例如,您在应用程序中做些什么需要这样的结构? - Alex
银行贷款转证券。每笔贷款可以有多个证券,而每个证券可以用于多笔贷款。 - PostMan
5个回答

1

好的,不给你一个答案,思考一下使用二维数组可以做什么,并从存储边缘信息的角度考虑问题。


考虑稀疏性。它将会是巨大而且大部分为空,而且没有好的方法来获取相邻节点的数量或遍历它们。 - Steven Sudit

1

这对我来说像是一个关系型数据库问题。您所描述的是具有多对多关系的两个表。是否适用取决于您的数据实际情况。先前建议每个对象包含另一个对象的列表是一种方法,但让我们直言不讳,这是一个关系型数据库。考虑使用像ADO.Net Entity Framework或LINQ这样的技术将您的数据定义为关系型数据库,并使用LINQ查询数据。

您提到您担心内存加倍。同样,这取决于您的真实世界数据是什么样子,但除非您有大量数据,否则这可能不会成为问题。唯一浪费的内存是空内存。如果(a)使问题更容易解决或(b)给您更多灵活性,请使用内存。除非您有性能问题,否则不要进行优化。


1

你基本上概述了一个图形模型,传统上被认为是“节点”和“边缘”。但证券/贷款是如何工作的。

对于这种情况,有两个经典的答案。

这取决于您想要从数据中提出什么问题,您希望以多高效率存储它以及您的数据有多密集。

例如,如果证券和贷款之间可能存在30%的关系,则密集的数据结构肯定会得到回报。只需保留一个大矩阵:X轴上的证券。Y轴上的贷款。(X,Y)表示该贷款存在。

如果集合不是非常密集,则开始使用“稀疏边缘数据结构”。根据您的应用程序,您可能会:

  1. 任何S对象都有一个它的L列表。{ S->L,L,L; S->L; S->L,L,L }。这使得查找S的邻居非常容易,但是查找L很困难。

  2. S对象有一个L列表,L有一个S列表:S->L,L,LL->S,S,S。使用更多的空间,但可以进行双向查询。

  3. 存储一组仅包含(S,L)对。除非您大多数时候需要询问“这个S和那个L是否相关?”,否则效果不佳。

  4. 存储S,LL,S的列表,并以某种方式对其进行索引。这就是我们所说的“让您的数据库完成工作”的意思。

另请参见关系数据结构


0
每个类都可以拥有另一个类型的列表。这样做不会重复数据,除非您使用值类型。交叉引用可能会导致内存泄漏。

0

Joe所说的是正确的。每个贷款都会有一系列的证券实例,而每个证券都会有一系列的贷款实例。关键在于确保您永远不会有一个贷款认为它与某个证券相关,但该证券并不同意。我建议仅允许成对进行添加或删除操作,以确保它们同时完成。我不认为这会导致内存泄漏,因为垃圾回收器足够聪明以处理此类情况。相比之下,引用计数无法处理此类情况,除非使用一些技巧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接