2

解決しようとしているlinqの問題があります。複数のグループに参加できるユーザーがいます。これで、次のように1つのグループに属するユーザーを返すことができます。

    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の共通メンバーです。これら2つのグループのユーザーのリストを探していない場合は、両方のグループに属している場合にのみユーザーを返す必要があります。

2つの文字列を入力として使用してこれを行う方法を知っている人はいますか?つまり、文字列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ステートメントを1つではなく2つの条件で変更する必要があります。

    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();
    }

ここにいくつかのメソッドがあります。1つはメソッドで2つの引数を取り(要求したもの)、もう1つはグループのリストを取ります(2つではなく3つから取得する必要がある場合など)

編集:

楽しみのために、この余分なメソッドもそこに入れると思いました。すべてのグループとそのメンバーのリストを編集します。

    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 に答える