【问题标题】:Is there a way to search two different collection and fill another collection using LINQ?有没有办法使用 LINQ 搜索两个不同的集合并填充另一个集合?
【发布时间】:2013-01-21 13:07:42
【问题描述】:

我有两个不同的集合,如下所示

public class Student
{
    public int StudentID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }      
}

public class Skills
{
    public int SkillID { get; set; }
    public int StudentID { get; set; }
    public string Keyskill_Name { get; set; }        
    public int LastUsedYear { get; set; }
}

这里一个学生可以包含多个keyskills

我只想填写一个新的集合,如下所示

public class StudentDetails
{
    public int StudentID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public list<string> Keyskill_Name { get; set; }
}

请帮助我。提前致谢。

【问题讨论】:

  • 您的数据来源是什么? Linq 到 sql/entities/ 其他?

标签: linq c#-4.0 lambda


【解决方案1】:

GroupJoin LINQ 方法是这种情况的完美解决方案:

    List<Student> students = new List<Student>();
    List<Skills> skills = new List<Skills>();

    List<StudentDetails> studentDetails = students.GroupJoin(skills, student => student.StudentID, skill => skill.StudentID, (student, skillsForStudent) => new StudentDetails
    {
        FirstName = student.FirstName,
        LastName = student.LastName,
        StudentID = student.StudentID,
        Keyskill_Name = (from skill in skillsForStudent
                         select skill.Keyskill_Name).ToList()
    }).ToList();

如何使用GroupJoin方法?

  • 调用集合中的方法,该方法与结果具有 1 对 1 的关系(这里对于每个 Student,只有一个对应的 StudentDetails。
  • 该方法的第一个参数是您要“分布”在其他项目上的集合(这里的技能是“分布”在整个学生集合中)
  • 第二个和第三个参数用于解释如何使第一个集合的元素和第二个集合的元素发生碰撞。 Lambda 表达式在这种情况下非常有用。
  • 最后,第四个参数用于定义结果。它是一个有 2 个参数的函数:第一个集合中的一个元素(此处为 students)及其在第二个集合中使用碰撞找到的对应元素。

【讨论】:

  • where skill.StudentID == student.StudentID 不是必需的。
  • 过去,这是非常正确的,因为它是加入 GroupJoin 的目的;)。谢谢。我已经编辑了帖子以更正它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
相关资源
最近更新 更多