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

时间:2013-03-18 13:05:35

标签: c# data-structures

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

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

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

所以给出了一个示例映射:

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

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

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

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

2 个答案:

答案 0 :(得分:7)

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

Child <- ChildToAnimalRelation -> Animal

因此ChildAnimal都有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);

答案 1 :(得分: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");
...