8

私には2つのクラスのインスタンスがたくさんあり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 ]

これを行うために私が考えることができる唯一の方法は、辞書とこの辞書の各項目(動物と子供の両方)のリストを使用することでしたが、リストの同期のロックにも対処する必要があり、面倒です。

4

2 に答える 2

7

データ構造を 3 つの層に分割する必要があると思います。

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);
于 2013-03-18T13:10:50.433 に答える
2

リストを使用してから、クエリに Linq を使用するのはどうですか? 考えられる実装の 1 つ:

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 に答える