var requirement1 = list1.Intersect(list2);
var requirement2 = list1.Except(list2);
var requirement3 = list2.Except(list1);
对于您的List<string>,这将是您所需要的。如果您正在为自定义类执行此操作,并且您正在寻找参考比较以外的其他内容,那么您需要确保该类正确覆盖了Equals 和GetHashCode。或者,您可以为上述方法的重载提供IEqualityComparer<YourType>。
编辑:
好的,现在您已经在 cmets 中指出它不是字符串列表,而是 List<MyObject>。在这种情况下,重写 Equals/GetHashCode(如果您的密钥应该始终唯一标识这些类并且您可以访问源代码)或提供 IEqualityComparer 实现(仍然涉及 Equals/GetHashCode,如果比较对这些类是唯一的,请使用此需要或者如果您无权访问 MyObject 源)。
例如:
class MyObjectComparer : IEqualityComparer<MyObject>
{
public bool Equals(MyObject x, MyObject y)
{
// implement appropriate comparison of x and y, check for nulls, etc
}
public int GetHashCode(MyObject obj)
{
// validate if necessary
return obj.KeyProperty.GetHashCode();
}
}
如果您使用这样的自定义相等比较器,则对上述方法的调用将是
list1.Intersect(list2, customComparerInstance);
编辑:现在您又移动了条形图,这一次问题涉及两个不同的类。为此,您将考虑使用连接操作,一个是内部的,另一个是外部的。
如果是
class Class1
{
public string Foo { get; set; }
}
class Class2
{
public string Bar { get; set; }
}
你可以写
var intersect = from item1 in list1
join item2 in list2
on item1.Foo equals item2.Bar
select item1;
var except1 = from item1 in list1
join item2 in list2
on item1.Foo equals item2.Bar into gj
from item2 in gj.DefaultIfEmpty()
where item2 == null
select item1;
要获取 list2 中的项目而不匹配 list1 中的 * 对象,只需颠倒 except1 查询中的列表/项目的顺序即可。