交叉引用多个对象

时间:2009-01-26 17:10:29

标签: c# .net-2.0

好的,所以我很难想出一个'好'的方法来做到以下几点:

组4对象,这样如果我对象A我可以轻松而无需通过对象B& C以确定对象D是否与对象A相关。以及任何其他引用组合。

我目前正在使用SortedLists将A链接到B,将B链接到C和C到D,并做一个非常草率的交叉引用工作。这很有效,但真的很难看。我不喜欢丑陋的代码,除非没有其他方法可以做到。

我正在考虑使用类来存储对象。但是引用它们的最佳方法是什么?

提前致谢


更多信息:

对象是表单上的控件。 4个不同的控件都彼此相关,因为它们对应于它们用于配置的相同设置。在表单上有多个设置被修改,每个设置使用4个控件。

我需要一种方法来轻松引用它们,而无需调用Setting4ControlB.Checked或Setting2ControlD.text,因此链接列表。我正在为某些控件使用通用事件来重用代码,它们都做同样的事情,除了它们引用不同的对象。

丑陋的部分首先是设置链接,其次是从A到D或C到A的引用,等等。我希望能够做到这样的事情:

GetSettingControls(ReferencingControl).ControlA.Checked

ReferencingControl将是事件中的发送者,ControlA是与ReferencingControl相关的控件。

4 个答案:

答案 0 :(得分:2)

首先,如果你有像A-> B-> C-> D这样的关系,那么看A是否与D有关的唯一方法就是从A到D一直走。你可以应用一些技巧

这将涉及手动跟踪程序中存在的每个间接引用,也就是说,您将负责以动态方式添加A-> D引用,这可能对某些逻辑有用,例如能够在游戏中“携带”物体。

你需要使用WeakReferences字典,这样你就不会通过引用来保持对象的存在......

public class MyObject
{
  public List<WeakReference> References = new List<WeakReference>();

  // My Class Properties and Methods
}

MyObject obj = new MyObject();
obj.refence.Add(new WeakReference(gun));

如果从对象池中清除了枪(例如,Level.Objects集合中的userObjects集合),那么弱引用将变为无效。

您可以通过执行

来检查对象
foreach ref in obj.references
  if (ref.IsAlive)
    object tool = ref.Target;

这只是一个例子,你知道,实现良好的访问器,属性等......

答案 1 :(得分:1)

您可以使用通用Dictionary类来指定对象之间的键/值对。

这将允许您根据另一个对象查找对象。

System.Collections.Generic.Dictionary<object, object> myDictionary = new Dictionary<object, object>();
myDictionary.Add(objectA, objectD);
myDictionary.Add(objectD, objectA);

答案 2 :(得分:0)

我不认为通过对象B和C是个好主意。你的对象应该只知道它的直接连接,然后从那里,你可以根据整个对象处理关系曲线图。

您应该能够轻松找到基本图形处理的算法。

我没有得到的是您使用SortedList的原因。连接是否存储在对象的外部?

无论如何,您应该能够通过存储包含从一个对象到另一个对象的直接连接的IEnumerabe(数组或其他)来轻松完成此操作。你只需要递归地处理(你不必按照这种方式实现它,但在精神上,这就是你要做的)对象,直到找到从一个到另一个的路径。您只需存储已经采用的路径,这样就不会发现自己处理循环引用。

答案 3 :(得分:0)

根据您尝试表示的关系类型,可能会有非常好的实现/算法。例如,如果关系确定了等价类,则可以使用Union Find Algorithm之类的内容来确定两个元素是否属于同一个类。