Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何发现共同行会?_C#_Linq_Lambda - Fatal编程技术网

C# 如何发现共同行会?

C# 如何发现共同行会?,c#,linq,lambda,C#,Linq,Lambda,我有一个包含用户列表的协会列表。和类型都具有ID属性 我希望发现所有用户都与我共享相同的协会(除了有问题的一个,我们显然会共享) 是否有一种智能linq和/或lambda技术可以实现这一点?您的问题很不清楚。不过,我还是试了一下。如果我理解正确: 您有一个类似以下内容的类: public class Guild { public List<User> Users; public int ID; } 然后,我们使用SelectMany展平列表的枚举: .SelectM

我有一个包含用户列表的协会列表。和类型都具有ID属性

我希望发现所有用户都与我共享相同的协会(除了有问题的一个,我们显然会共享)


是否有一种智能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
    }