分享
三行代码  ›  专栏  ›  技术社区  ›  Tacot

LINQ通过多个值获取另一个列表中包含的对象的结果

  •  0
  • Tacot  · 技术社区  · 1 周前

    我有两张单子,一张是班上所有的优等生,另一张是班上所有的学生和他们的教室,假设我想得到荣誉名单上的所有学生和他们的教室:

    public class Kids 
    {
        string FirstName;
        string LastName;
        int Age;
        int Grade; 
    }
    
    public class Students
    {
        string FirstName;
        string LastName;
        string Classroom; 
    }
    

    我想用类似这样的方法:

    List<Students> students = classroom
             .Where(i => honorKids
                        .Select(j => j.FirstName)
                        .Contains(i.FirstName) && honorKids
                               .Select(j => j.LastName)
                               .Contains(i.LastName)
                   )
    

    问题是孩子的名字和姓氏之间没有关联,所以举例来说,如果有一个名为John Bezoz的荣誉学生、另一个名为Mark Smith的荣誉学生和一个名为John Smith的非荣誉学生,它将作为荣誉学生返回,因为他的名字和姓氏都在荣誉列表中,但不在同一行。

    我如何进行比较以确保名字和姓氏在列表中但在同一行?

    1 回复  |  直到 1 周前
        1
  •  2
  •   Guru Stron    1 周前

    你不需要表演 Select 的,尝试使用 Any

    List<Students> students = classroom
        .Where(i => honorKids.Any(j => j.FirstName == i.FirstName && j.LastName == i.LastName))
        .ToList();
    
        2
  •  0
  •   Tim Schmelter    1 周前

    为了完整起见,您还可以使用 Join 在两个列表之间:

    var honorStudents = from student in classRoom
                        join kid in honorKids 
                        on new {student.FirstName, student.LastName} equals new {kid.FirstName, kid.LastName}
                        select student;
                            
    List<Students> students = honorStudents.ToList();
    

    如果有可能存在“重复的”荣誉儿童,那么这个结果和古鲁的方法是有区别的。然后join将返回所有匹配项。