我有很多实例有两个类Children
和Animal
,它们具有多对多实体关系。
我希望有一个数据结构,以便给定Children
我可以获得映射到它的Animal
列表,反之亦然。对于任何给定的Animal
,我都可以获得映射到它的Children
列表。
我需要这个数据结构是并发的,这样任何线程都可以访问它。
所以给出了一个示例映射:
Child1 -> Animal1
Child1 -> Animal2
Child1 -> Animal3
Child2 -> Animal2
Child2 -> Animal3
Child3 -> Animal3
查询Child1
我希望获得一个返回列表:[ Animal1, Animal2, Animal2 ]
。
查询Animal2
我希望获得一个返回列表:[ Child2, Child3 ]
。
我能想到的唯一方法是使用字典和列表中的每个项目(包括动物和儿童),但我还必须处理锁定列表的同步,这是很麻烦的。
答案 0 :(得分: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);
答案 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");
...