C#多对多关系

时间:2009-09-04 00:25:01

标签: c# algorithm bipartite

所以,我需要一些方法来实现C#

中的无向网络(我认为这是正确的术语)

假设我有以下数据:

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

我如何实施可以支持此功能的内容?

这样做的一种方法是创建一个包含Foo和Bar的类,对于我的例子,我有6个这样的,每个可能的组合,但是这会使数据翻倍。

根据这些数据,我需要能够根据它指向的Bar的数量来执行Foo1的计算,以及有多少Foo的Bar的点等等。

我不是在寻找答案,我宁愿指出如何实现这个,甚至可能是一些链接。

5 个答案:

答案 0 :(得分:1)

好吧,在没有给出答案的情况下,考虑一下二维数组可以做些什么,并从存储边缘信息的角度考虑问题。

答案 1 :(得分:1)

这对我来说就像是一个关系数据库问题。你所描述的是两个具有多对多关系的表。这个答案是否合适将取决于您的数据实际情况。以前建议让每个对象包含另一个对象的List是一种方法,但让我们称之为spade,这是一个关系数据库。考虑使用ADO.Net Entity Framework或LINQ等技术将您的数据定义为关系数据库,并使用LINQ查询数据。

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

答案 2 :(得分:1)

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

这类事情有两个经典答案。

这取决于您希望能够询问数据的问题,存储效率以及数据密集程度。

如果证券与贷款之间存在30%的可能关系,那么密集的数据结构肯定会得到回报。只需保留一个大矩阵:X上的证券.Y(X,Y)上的贷款意味着贷款存在。

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

  1. 任何S对象都有一个Ls的列表。 { S->L,L,L; S->L; S->L,L,L }。找到S的邻居真的很容易,但很难找到L's

  2. S对象有一个Ls列表,Ls有一个S列表:(S->L,L,LL->S,S,S)。使用更多空间,但为您提供双向查询。

  3. 存储一组刚刚(S,L)对。非常糟糕,除非你最需要问的是“这是S和L相关吗?”

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

  5. 另见Data structure for relationships

答案 3 :(得分:0)

每个类都可以有另一个类的列表。除非使用值类型,否则不要以这种方式复制数据。交叉引用可能导致内存泄漏。

答案 4 :(得分:0)

乔说的是正确的轨道。每个贷款都有一个安全实例列表,每个安全性都有一个贷款实例列表。诀窍是确保你永远不会有一个认为它与安全相关但是安全不同意的贷款。我建议仅在成对上允许添加或删除操作,以确保它们并行完成。我没有看到这会如何导致内存泄漏,因为GC足够智能来处理这个问题。相反,参考计数如果没有一些技巧就无法解决这个问题。