使用C#中的某种模式实现此功能的最佳方法是什么?
给定一个表示社交网络的数据结构,编写一个函数来查找一定程度的朋友。第一等级的朋友是会员的直接朋友,第二等级的朋友是会员朋友的朋友,不包括第一等级的朋友,等等 例如,如果A是B的朋友,B是C的朋友,那么GetFriendsOfDegree(A,2)应该返回C,因为C是A的唯一二级朋友(B是A的一级朋友)使用C#中的某种模式实现此功能的最佳方法是什么?,c#,design-patterns,challenge-response,C#,Design Patterns,Challenge Response,给定一个表示社交网络的数据结构,编写一个函数来查找一定程度的朋友。第一等级的朋友是会员的直接朋友,第二等级的朋友是会员朋友的朋友,不包括第一等级的朋友,等等 例如,如果A是B的朋友,B是C的朋友,那么GetFriendsOfDegree(A,2)应该返回C,因为C是A的唯一二级朋友(B是A的一级朋友) 方法名称:GetFriendsOfDegree 使用制度; 使用System.Collections.Generic; 公共班级成员 { 公共字符串电子邮件{get;private set;} 公
方法名称:GetFriendsOfDegree
使用制度;
使用System.Collections.Generic;
公共班级成员
{
公共字符串电子邮件{get;private set;}
公共ICollection好友{get;private set;}
公共成员(字符串电子邮件):此(电子邮件,新列表())
{
}
公共成员(字符串电子邮件、ICollection好友)
{
this.Email=电子邮件;
这个。朋友=朋友;
}
public void AddFriends(ICollection好友)
{
foreach(朋友中的成员朋友)
this.Friends.Add(Friends);
}
公众朋友(会员朋友)
{
this.Friends.Add(Friends);
}
}
公课朋友
{
公共静态列表GetFriendsOfDegree(成员成员,int度)
{
抛出新的NotImplementedException(“等待实现”);
}
公共静态void Main(字符串[]args)
{
成员a=新成员(“a”);
成员b=新成员(“b”);
成员c=新成员(“c”);
a、 秘书长(b);
b、 秘书长(c);
foreach(GetFriendsOfDegree(a,2))中的成员朋友
Console.WriteLine(friend.Email);
}
}
这是一个可以用算法解决的图形问题。图的表示形式非常适合于实现BFS算法
创建成对的队列(成员,距离)
,以及一组访问过的成员。以零距离推动初始构件
创建一个从队列读取的循环,并检查该成员是否是访问集的一部分。如果是,请放下该对并继续。否则,按距离d+1
推送当前成员的所有好友,其中d
是您已退出队列的成员的距离
当距离达到
度的目标距离时
,将成员收集到结果列表中。继续循环,直到队列为空。?真的吗?…不。。只是想看看我是否使用了正确的方法,或者有人有其他想法来实现它?!酷。。。好主意,但我的主意是使用一些设计模式。。。简朴intuitive@YuriDuretti设计模式是关于不同抽象层次的。当您只需要实现单个类的单个方法时,您需要的是算法,而不是设计模式。是的!!!我同意,只是想看看我是否使用了正确的方法,或者有人有其他想法来实现它?!
Method name: GetFriendsOfDegree
using System;
using System.Collections.Generic;
public class Member
{
public string Email { get; private set; }
public ICollection<Member> Friends { get; private set; }
public Member(string email) : this(email, new List<Member>())
{
}
public Member(string email, ICollection<Member> friends)
{
this.Email = email;
this.Friends = friends;
}
public void AddFriends(ICollection<Member> friends)
{
foreach (Member friend in friends)
this.Friends.Add(friend);
}
public void AddFriend(Member friend)
{
this.Friends.Add(friend);
}
}
public class Friends
{
public static List<Member> GetFriendsOfDegree(Member member, int degree)
{
throw new NotImplementedException("Waiting to be implemented.");
}
public static void Main(string[] args)
{
Member a = new Member("A");
Member b = new Member("B");
Member c = new Member("C");
a.AddFriend(b);
b.AddFriend(c);
foreach (Member friend in GetFriendsOfDegree(a, 2))
Console.WriteLine(friend.Email);
}
}