これを解決するために、セットベースの操作を使用することを検討してください。
提案したデータ構造が与えられているので、問題を解決するために、直接の友人と間接的な友人の両方で解決する必要があります。直接の友人の場合は2件あります。 1、共通の友人はNameFriend1、もう1人はnameFriend2です。これらの2つのケースは、メソッドIndirectFriendsの終わりに解決されます。
直接の友人の結果を2番目のリストのNameFriend1に、2番目のリストのNameFriend2のときにもう1つ、同じ友人の結果を同じデータセットに2回参加させる必要があるため、 。そのため、解決すべき4つのケースがあります。
IndirectFriendsメソッドの最後に、共通の友だちをリストから除外し、別個の結果のみを返します。
このコードは、同じオブジェクトbrianがリスト内で使用されているため、また比較のためにのみ使用されます。あなたが同じ値を持つ新しい変数をインスタンス化していて、それらが等しいものとしてLINQによって評価されるようにしたい場合は、あなたの文言が誤解を招く How to Implement IComparable interface?
[TestMethod]
public void TestMethod1()
{
List<BestFriends> ListOfBestFriends = new List<BestFriends>();
var adam = new Friend { Name = "Adam" };
var brian = new Friend { Name = "Brian" };
var chris = new Friend { Name = "Chris" };
var daniel = new Friend { Name = "Daniel" };
var eddie = new Friend { Name = "Eddie" };
var ian = new Friend { Name = "Ian" };
var john = new Friend { Name = "John" };
ListOfBestFriends.Add(new BestFriends { NameFriend1 = adam, NameFriend2 = brian });
ListOfBestFriends.Add(new BestFriends { NameFriend1 = brian, NameFriend2 = chris });
ListOfBestFriends.Add(new BestFriends { NameFriend1 = chris, NameFriend2 = daniel });
ListOfBestFriends.Add(new BestFriends { NameFriend1 = eddie, NameFriend2 = ian });
ListOfBestFriends.Add(new BestFriends { NameFriend1 = brian, NameFriend2 = john });
var result = IndirectFriends(brian, ListOfBestFriends);
}
List<Friend> IndirectFriends(Friend commonFriend, List<BestFriends> bestFriendsPairs)
{
/* Get inDirect Friends where commonfriend = NameFriend2 */
/* First list is joined on Namefriend2 and Namefriend1 */
var l1 = (from bfp in bestFriendsPairs
join bfpR in bestFriendsPairs
on bfp.NameFriend2 equals bfpR.NameFriend1
where bfp.NameFriend1 == commonFriend
select bfpR.NameFriend2).ToList();
/* Get inDirect Friends where commonfriend= NameFriend2 */
/* First list is joined on Namefriend2 and Namefriend2 */
l1.AddRange(from bfp in bestFriendsPairs
join bfpR in bestFriendsPairs
on bfp.NameFriend2 equals bfpR.NameFriend2
where bfp.NameFriend1 == commonFriend
select bfpR.NameFriend1);
/* Get InDirect Friends where commonfriend = NameFriend2 */
/* First list is joined on Namefriend1 and Namefriend2 */
l1.AddRange (from bfp in bestFriendsPairs
join bfpL in bestFriendsPairs
on bfp.NameFriend1 equals bfpL.NameFriend2
where bfp.NameFriend2 == commonFriend
select bfpL.NameFriend1);
/* Get InDirect Friends where commonfriend= NameFriend2 */
/* First list is joined on Namefriend1 and Namefriend1 */
l1.AddRange(from bfp in bestFriendsPairs
join bfpL in bestFriendsPairs
on bfp.NameFriend1 equals bfpL.NameFriend1
where bfp.NameFriend2 == commonFriend
select bfpL.NameFriend2);
/* Get Direct Friends where commonfriend= NameFriend2 */
l1.AddRange(from bfp in bestFriendsPairs
where bfp.NameFriend2 == commonFriend
select bfp.NameFriend1);
/* Get Direct Friends where commonfriend= NameFriend1 */
l1.AddRange(from bfp in bestFriendsPairs
where bfp.NameFriend1 == commonFriend
select bfp.NameFriend2);
/*exclude commonfriend, and get distinct */
return l1.Where(f=>f!= commonFriend).Distinct().ToList();
}
以下IComparableインターフェイスのリンクを実装する必要があります。関連クラスを検索するのではなく、同じクラスの関連オブジェクト(あなたの場合は「Friend」です)を検索しています。これを考えると、私はあなたの 'IndirectFriends'メソッドで最初のパラメータの意味を理解していません。あなたが間接的な友達をしたいと思っているのは「Friend」だと思いますか? "IndirectFriend"はどのように定義しますか?あなたの再帰の深さ、または間接を見つけるために友人の親友から始まる最初のレベルだけ?どうか明らかにしてください。 ヒント:グラフを読み上げます。 –
私はスタックオーバーフローの答えの範囲を超えているかもしれないグラフトラバーサルアルゴリズムが効果的だと思います。 – BradleyDotNET
@ K.Berger 'Friend'パラメータは、すべての間接的に関連する友人を見つけたい友達です。 「間接的な友人」とは、すべてのレベルのすべての友人が、「友人」パラメータに黙って接続できることを意味します(私の例を見てください)。私はグラフの横断を使用すべきだと思いますが、以前はそれを使ったことがありません。 –