8

我有很多实例两个类ChildrenAnimal它们具有多对多实体关系。

我想要一个数据结构,这样给定一个Children我可以得到一个Animal映射到它的列表,反之亦然。对于任何给定Animal的,我都可以获得Children映射到它的列表。

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

所以给出一个示例映射:

Child1 -> Animal1
Child1 -> Animal2
Child1 -> Animal3
Child2 -> Animal2
Child2 -> Animal3
Child3 -> Animal3

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

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

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

4

2 回答 2

7

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

Child <- ChildToAnimalRelation -> Animal

所以Child两者Animal都有ChildToAnimalRelation

public class ChildToAnimalRelation 
{
    public Child Child { get; set; }
    public Animal Animal { get; set; }
}

获得动物孩子将按如下方式完成:

var children = currentAnimal.ChildToAnimalRelations.Select(r => r.Child);

反之亦然:

var animals = currentChild.ChildToAnimalRelations.Select(r => r.Animal);
于 2013-03-18T13:10:50.433 回答
2

使用列表然后使用 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");
...
于 2013-03-18T13:11:27.657 回答