2

我有一个要解决的 linq 问题,我有一些用户可以属于多个组,现在我可以返回哪些用户属于一个组,如下所示:

    List<Student> students = new List<Student>();
    public List<Student> ReturnStudentByGroupName(string groupName)
    {
        List<Student> student = (from g in students
                              where
                                  (from t in g.StudentGroup where t.GroupName == groupName select t).Count() > 0
                              select g).ToList();
        return student;
    }

我现在的问题是我需要找到多个组的共同用户吗?例如,谁是组 A 和组 B 的共同成员。我不是在寻找这两个组的用户列表,它应该只返回同时属于这两个组的用户。

有谁知道如何使用两个字符串作为输入,即字符串 firstgroupName、字符串 secondgroupName。然后返回普通学生?

4

3 回答 3

2
IEnumerable<Student> StudentsOfGroup(Group g)
{
    return students.Where(s => s.StudentGroup.Contains(g));
}

IEnumerable<Student> CommonStudents(IEnumerable<Group> groups)
{
    return groups
        .Select(StudentsOfGroup)
        .Aggregate((acc, g) => acc.Intersect(g));
}

或者根据组的数量,以下可能会更快:

IEnumberable<Student> CommonStudents(IEnumerable<Group> groups)
{
    var groupSet = new HashSet<Group>(groups);
    return students.Where(s => groupSet.IsSubsetOf(s.StudentGroup));
}
于 2012-04-22T06:17:53.603 回答
2
IEnumberable<Student> GroupIntersection(IEnumerable<Group> groups)
{
    return students
        .Where(s => groups.All(g => s.StudentGroup.Contains(g)));
}
于 2012-04-22T06:21:17.030 回答
1

好吧,您说您只想返回属于 A 组和 B 组的用户列表,因此您自然只需要使用两个条件而不是一个条件来修改 where 语句。

    List<Student> students = new List<Student>();
    public List<Student> GetIntersectingStudents(string groupOne, string groupTwo)
    {
        var student = from s in students
                      let grps = s.StudentGroup.ConvertAll(gn => gn.GroupName)
                      where grps.Contains(groupOne) && grps.Contains(groupTwo)
                      select s;
        return student.ToList();
    }
    public List<Student> GetIntersectingStudents(params string[] groups)
    {
        var student = from s in students
                      let grps = s.StudentGroup.ConvertAll(gn => gn.GroupName)
                      where !groups.Except(grps).Any()
                      select s;
        return student.ToList();
    }

这里有几个方法,其中一个在方法中接受两个参数(你要求什么),另一个接受组列表(如果你需要从三个而不是两个等中获取)

编辑:

我想我也会把这个额外的方法放在那里,只是为了好玩。它编译了所有组及其成员的列表。

    public static Dictionary<string, List<Student>> GetStudentGroups()
    {
        var temp = from s in students
                   let grps = s.StudentGroup.ConvertAll(gn => gn.GroupName)
                   from grp in grps
                   group s by grp
                   into g
                   select g;
        return temp.ToDictionary(grping => grping.Key, studnt => studnt.ToList());
    }
于 2012-04-22T06:33:52.080 回答