C# 我在这里使用什么数据结构?

C# 我在这里使用什么数据结构?,c#,data-structures,C#,Data Structures,我有很多实例,有两个类Children和Animal,它们具有多对多实体关系 我希望有一个数据结构,以便给定一个子对象,我可以得到映射到它的动物列表,反之亦然。对于任何给定的动物,我可以得到映射到它的孩子的列表 我需要这个数据结构是并发的,这样任何线程都可以访问它 因此,给出了一个映射示例: Child1 -> Animal1 Child1 -> Animal2 Child1 -> Animal3 Child2 -> Animal2 Child2 -> Animal

我有很多实例,有两个类
Children
Animal
,它们具有多对多实体关系

我希望有一个数据结构,以便给定一个
子对象
,我可以得到映射到它的
动物列表,反之亦然。对于任何给定的
动物
,我可以得到映射到它的
孩子的列表

我需要这个数据结构是并发的,这样任何线程都可以访问它

因此,给出了一个映射示例:

Child1 -> Animal1
Child1 -> Animal2
Child1 -> Animal3
Child2 -> Animal2
Child2 -> Animal3
Child3 -> Animal3
查询
Child1
我希望得到一个返回的列表:
[Animal1,Animal2,Animal2]

查询
Animal2
我希望得到一个返回的列表:
[Child2,Child3]


我能想到的唯一方法是为字典中的每个项目(包括动物和儿童)使用字典和列表,但我还必须处理锁定列表同步的问题,这很麻烦。

我认为您必须将数据结构分为三层

Child <- ChildToAnimalRelation -> Animal
给孩子们买一个动物玩具的方法如下:

var children = currentAnimal.ChildToAnimalRelations.Select(r => r.Child);
反之亦然:

var animals = currentChild.ChildToAnimalRelations.Select(r => r.Animal);

使用列表然后使用Linq进行查询怎么样?一种可能的实施方式:

List<Tuple<string, string>> allItems=new ...
allItems.Add(Tuple.Create("Child1", "Animal1");
...
var child1RelatedItems=allItems.Where(entry =>entry.Item1=="Child1");
var animal1RelatedItems=allItems.Where(entry =>entry.Item2=="Animal1");
...
List allItems=new。。。
添加(Tuple.Create(“Child1”、“Animal1”);
...
var child1relatedEMS=allItems.Where(entry=>entry.Item1==“Child1”);
var animal1RelatedItems=allItems.Where(entry=>entry.Item2==“Animal1”);
...

您应该添加一个映射表,例如AnimalChildren,以帮助删除多对多。使用多个名词来类名是坏的风格;考虑将您的类重命名为“子”。。这种多对多关系会随着时间的推移而改变吗?或者,一旦您有了一组子对象和动物,它们的关系就会固定吗?如果没有写操作,使操作线程安全会容易得多。@EricLippert是的,关系会改变。好的,假设您有一个图形数据结构。节点是子对象和动物,并且关系是进行查询的代码是否只引用了一个节点,或者一个节点以及该节点所在的整个图形?我的意思是:是否存在一些“数据库”你正在查询的对象,或者你必须拥有每个对象中的所有信息吗?考虑通过在不同层之间以这种方式分裂,你的框架中的任何类型的更新都需要卡里更新每一个感兴趣的层。s或子项,而不仅仅是给定对应项的一次。您必须事先添加where子句…@spontifix:集合位于对应项本身,并不包含所有关系。我编辑了变量名以防止混淆。这是否足够主要取决于输入。其性能直接与有很多关系(而不是有多少儿童或动物)。如果两者之间的映射是密集的,并且两者都有很多…oi.如果只是一对,这就可以了。可能不是唯一的。ChildToAnimalRelation类与元组的作用相同。除了更具描述性的名称之外,你什么也得不到。另一个答案是将关系附加到每个儿童和动物,即o它只需在与特定对象匹配的对象上循环。
List<Tuple<string, string>> allItems=new ...
allItems.Add(Tuple.Create("Child1", "Animal1");
...
var child1RelatedItems=allItems.Where(entry =>entry.Item1=="Child1");
var animal1RelatedItems=allItems.Where(entry =>entry.Item2=="Animal1");
...