我有一个练习,要求我为下一个任务制作字典:用dictionary检查两个dictionary的方法<字符串,列表<字符串>gt;键表示教师对象,字符串列表表示科目值。我使用List是因为它可以有多个值
Dictionary<string, List<string>> subjectsOfTeachers = new();
Dictionary<string, List<string>> subjectsOfPupils = new();
下一个任务是检查subjectOfPupils中是否有值等于教师列表值。所以我做了下一个:
public List<string> GetTeachers(string pupil)
{
var a = new List<string>();
foreach(KeyValuePair<string,List<string>>kvp in subjectsOfTeachers)
{
if(subjectsOfPupils[pupil] == kvp.Value)
{
a.Add(kvp.Key);
}
}
return a;
逻辑是,它确实检查相同的值,但它检查整个列表值的相似性。有什么方法可以访问值列表并手动检查它吗?抱歉英语不好。
subjectsOfPupils[pupil] == kvp.Value
将比较两个列表。列表是引用类型,因此默认情况下,它们使用参考等式。这可能不是您想要的。如果我正确理解任务,您希望两个列表之间存在交集。幸运的是,我们有一个方法:Intersect。这将返回两个列表中存在的所有项目。如果我们只关心是否有任何项目,我们可以使用.any方法。
如果任务是检查任何的教师是否与的任何意主题,我们可以使用SelectMany将字典扁平化为纯列表。
var anySharedSubject = subjectsOfTeachers.SelectMany(kvp => kvp.Value)
.Intersect(subjectsOfPupils.SelectMany(kvp => kvp.Value))
.Any();
请注意,这使用了Linq方法,虽然它们非常方便,但您可能应该考虑如何仅使用循环编写intersect方法。