var SameNames = ListA.All(x => ListB.All(y => y.Name.Equals(x.Name)));
您在此处写的是要求 A 中的 所有 名称与 B 中的 所有 名称匹配。这显然与您的示例数据冲突,因为 A 中的“Marc”不等于 B 中的“朱莉”。
只有当 A 和 B 总共只包含一个不同的名称时,您当前的代码才会返回 true。这对您要解决的问题毫无意义。
您实际上要解决的是,如果来自 A 的 所有 名称在 B 中具有 一个 匹配。这可以通过以下方式实现:
var sameNames = listA.All(a => listB.Any(b => b.Name.Equals(a.Name)));
注意Any。如果找到(至少)一个匹配项,它将返回true。这与 All 不同,后者仅在 B 中的 所有 值都匹配时返回 true。
但是,这还不够。您现在已经确定 A 中的所有名称都出现在 B 中,但 B 中仍有可能包含更多不在 A 中的名称。以以下示例为例:
var listA = new List<string>() { "Andy", "Bobby", "Cindy" };
var listB = new List<string>() { "Andy", "Bobby", "Cindy", "David" };
var SameNames = listA.All(a => listB.Any(b => b.Name.Equals(a.Name)));
SameNames 将是true,但那是因为你只有一个方向。您需要检查两个方向:
var listA_in_listB = listA.All(a => listB.Any(b => b.Name.Equals(a.Name)));
var listB_in_listA = listB.All(b => listA.Any(a => a.Name.Equals(b.Name)));
var sameNames = listA_in_listB && listB_in_listA;
这会给你想要的结果。
请注意,如何处理此问题还有一些其他变体。
如果您可以保证每个列表不包含任何重复项,那么您可以简单地进行一次检查,然后确认列表长度相等,而不是进行两次相同的检查:
var listA_in_listB = listA.All(a => listB.Any(b => b.Name.Equals(a.Name)));
var sameLength = listA.Length == listB.Length;
var sameNames = listA_in_listB && sameLength;
这更有效,但它确实需要知道您的名字在每个列表中都是唯一的。