我想知道如何使用“contains”而不是“equals”来连接两个列表。在SO上也有类似的问题,但似乎都不起作用。下面是我的示例代码,我的目标是让不属于任何classRoom的学生:
var a = new Student("A");
var b = new Student("B");
var c = new Student("C");
var d = new Student("D");
var e = new Student("E");
var f = new Student("F");
var students = new List<Student>() { a, b, c, d, e, f };
var classRoomA = new ClassRoom();
classRoomA.Students.Add(a);
classRoomA.Students.Add(b);
var classRoomB = new ClassRoom();
classRoomB.Students.Add(c);
classRoomB.Students.Add(d);
var classRoomC = new ClassRoom();
classRoomC.Students.Add(e);
var classes = new List<ClassRoom> { classRoomA, classRoomB, classRoomC };
//option A. This works
var studentsWithoutClassRoom = students
.Where(stu => !classes.Any(r => r.Students.Contains(stu)))
.Select(s => s);
//optionB .This in one of many options that
//I have tried and it gives very interesting results
var studentsWithoutClassRoomTest = from w in students
from l in classes
where !l.Students.Contains(w)
select l;
正如您所看到的,我可以使用选项A得到答案,但我想了解的是,是否可以使用选项B中的方法来完成它?
3条答案
按热度按时间fkaflof61#
请尝试下列查询:
jhdbpxl92#
我不认为我会说你是"加入"两个名单时,你的目标是找到那些谁不属于(更多的相反加入)。
所以我会创建一个
ClassRoom
中所有Student
的HashSet
,然后找到不在那个集合中的Student
:我认为通过
Contains
加入更像是产生一个Student
和它们所属的ClassRoom
的列表(假设一个Student
可以在多个ClassRoom
中):qgzx9mmu3#
如果你想要学生,你不应该选择
w
而不是l
吗?使用
join
代替from
,并使用on
给出联接条件