C# 如何发现共同行会?
我有一个包含用户列表的协会列表。和类型都具有ID属性 我希望发现所有用户都与我共享相同的协会(除了有问题的一个,我们显然会共享)C# 如何发现共同行会?,c#,linq,lambda,C#,Linq,Lambda,我有一个包含用户列表的协会列表。和类型都具有ID属性 我希望发现所有用户都与我共享相同的协会(除了有问题的一个,我们显然会共享) 是否有一种智能linq和/或lambda技术可以实现这一点?您的问题很不清楚。不过,我还是试了一下。如果我理解正确: 您有一个类似以下内容的类: public class Guild { public List<User> Users; public int ID; } 然后,我们使用SelectMany展平列表的枚举: .SelectM
是否有一种智能linq和/或lambda技术可以实现这一点?您的问题很不清楚。不过,我还是试了一下。如果我理解正确: 您有一个类似以下内容的类:
public class Guild
{
public List<User> Users;
public int ID;
}
然后,我们使用SelectMany
展平列表的枚举:
.SelectMany(x => x)
然后,我们将所有这些都封装在一个容器中,以删除重复用户(多个协会中的用户)
最后,我们将哈希集
转换为列表
(可选)。注释如下:
public List<User> FindSimilarUsers(List<Guild> lGuilds, List<Guild> MyGuilds)
{
// phase 1: map user to his guilds
Dictionary<int, List<int>> dUserToGuilds = new Dictionary<int, List<int>>();
lGuilds.ForEach(guild => guild.Users.ForEach(user => dUserToGuilds[user.ID] = new List<int>()));
lGuilds.ForEach(guild => guild.Users.ForEach(user => dUserToGuilds[user.ID].Add(guild.ID)));
// phase 2: map user id to corresponding user object
Dictionary<int, User> dUsers = new Dictionary<int, User>();
lGuilds.ForEach(guild => guild.Users.ForEach(user => dUsers[user.ID] = user));
// phase 3: find similar users
List<int> MyGuildsIds = MyGuilds.Select(guild => guild.ID).ToList();
return dUserToGuilds.Keys.ToList().Where(user_id => dUserToGuilds[user_id].Intersect(MyGuildsIds).Count() > 1).Select(user_id => dUsers[user_id]).ToList();
}
public List FindSimilarUsers(List lguild,List myguild)
{
//阶段1:将用户映射到其行会
Dictionary dUserToGuilds=新建字典();
lGuilds.ForEach(guild=>guild.Users.ForEach(user=>dUserToGuilds[user.ID]=newlist());
lGuilds.ForEach(guild=>guild.Users.ForEach(user=>dUserToGuilds[user.ID].Add(guild.ID));
//阶段2:将用户id映射到相应的用户对象
Dictionary dUsers=新字典();
lGuilds.ForEach(guild=>guild.Users.ForEach(user=>dUsers[user.ID]=user));
//阶段3:寻找相似的用户
列出MyGuildsIds=MyGuilds.Select(guild=>guild.ID).ToList();
返回dusertobuilds.Keys.ToList().Where(user_id=>dusertobuilds[user_id]。Intersect(MyGuildsIds).Count()>1。选择(user_id=>dUsers[user_id])。ToList();
}
以及一名测试人员:
static void Main(string[] args)
{
List<Guild> lGuilds = new List<Guild>();
List<Guild> MyGuilds = new List<Guild>();
User u1 = new User { ID = 1 };
User u2 = new User { ID = 2 };
User u3 = new User { ID = 3 };
User u4 = new User { ID = 4 };
Guild g1 = new Guild { ID = 1, Users = new List<User>() { u1, u2, u4 } };
Guild g2 = new Guild { ID = 2, Users = new List<User>() { u1, u3, u4 } };
Guild g3 = new Guild { ID = 3, Users = new List<User>() { u2, u4 } };
lGuilds.Add(g1);
lGuilds.Add(g2);
lGuilds.Add(g3);
MyGuilds.Add(g1);
MyGuilds.Add(g2);
FindSimilarUsers(lGuilds, MyGuilds).ForEach(user => Console.WriteLine(user.ID));
// output:
// 1
// 4
}
static void Main(字符串[]args)
{
List lGuilds=新列表();
List MyGuilds=新列表();
用户u1=新用户{ID=1};
用户u2=新用户{ID=2};
用户u3=新用户{ID=3};
用户u4=新用户{ID=4};
帮会g1=新帮会{ID=1,用户=新列表(){u1,u2,u4};
帮会g2=新帮会{ID=2,用户=新列表(){u1,u3,u4};
帮会g3=新帮会{ID=3,用户=新列表(){u2,u4};
lGuilds.Add(g1);
lGuilds.Add(g2);
lGuilds.Add(g3);
MyGuilds.Add(g1);
MyGuilds.Add(g2);
FindSimilarUsers(LGuild,MyGuilds).ForEach(user=>Console.WriteLine(user.ID));
//输出:
// 1
// 4
}
您必须首先描述如何存储公会和用户?在数据库中?在列表中
?如果是这样的话,怎么办?请列出或IReadOnlyCollection,具体说明所有与您相同的行会?或者他们可以加入更少/更多的公会?他们可以加入更多或更少的公会。我将100%的时间在特定的公会。用户列表。当我与一个用户共享超过一个帮会时,我对所有发生的事情都感兴趣。我的用户在_client.CurrentUser.ID中。列表在_client.Guilds[]用户[]抱歉伙计我不知道你在说什么你有一些示例代码吗?
.SelectMany(x => x)
public List<User> FindSimilarUsers(List<Guild> lGuilds, List<Guild> MyGuilds)
{
// phase 1: map user to his guilds
Dictionary<int, List<int>> dUserToGuilds = new Dictionary<int, List<int>>();
lGuilds.ForEach(guild => guild.Users.ForEach(user => dUserToGuilds[user.ID] = new List<int>()));
lGuilds.ForEach(guild => guild.Users.ForEach(user => dUserToGuilds[user.ID].Add(guild.ID)));
// phase 2: map user id to corresponding user object
Dictionary<int, User> dUsers = new Dictionary<int, User>();
lGuilds.ForEach(guild => guild.Users.ForEach(user => dUsers[user.ID] = user));
// phase 3: find similar users
List<int> MyGuildsIds = MyGuilds.Select(guild => guild.ID).ToList();
return dUserToGuilds.Keys.ToList().Where(user_id => dUserToGuilds[user_id].Intersect(MyGuildsIds).Count() > 1).Select(user_id => dUsers[user_id]).ToList();
}
static void Main(string[] args)
{
List<Guild> lGuilds = new List<Guild>();
List<Guild> MyGuilds = new List<Guild>();
User u1 = new User { ID = 1 };
User u2 = new User { ID = 2 };
User u3 = new User { ID = 3 };
User u4 = new User { ID = 4 };
Guild g1 = new Guild { ID = 1, Users = new List<User>() { u1, u2, u4 } };
Guild g2 = new Guild { ID = 2, Users = new List<User>() { u1, u3, u4 } };
Guild g3 = new Guild { ID = 3, Users = new List<User>() { u2, u4 } };
lGuilds.Add(g1);
lGuilds.Add(g2);
lGuilds.Add(g3);
MyGuilds.Add(g1);
MyGuilds.Add(g2);
FindSimilarUsers(lGuilds, MyGuilds).ForEach(user => Console.WriteLine(user.ID));
// output:
// 1
// 4
}