gpt4 book ai didi

c# - 计算两组交集和差集的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 19:19:56 27 4
gpt4 key购买 nike

我有 2 个列表 List<Class1>List<Class2>由同一属性进行比较 Class1.KeyClass2.Key (字符串),我想编写一个函数,从中生成 3 个列表

  1. List<Class1>两个列表中都存在的元素
  2. List<Class1>仅存在于第一个列表中的元素
  3. List<Class2>仅存在于第二个列表中的元素

有什么快速的方法吗?

最佳答案

var requirement1 = list1.Intersect(list2);
var requirement2 = list1.Except(list2);
var requirement3 = list2.Except(list1);

为您的List<string> ,这就是您所需要的。如果您正在为自定义类执行此操作并且您正在寻找引用比较以外的其他内容,您需要确保该类被正确覆盖 EqualsGetHashCode .或者,您可以提供 IEqualityComparer<YourType>重载上述方法。

编辑:

好的,现在你已经在评论中指出它不是一个字符串列表,它是一个 List<MyObject> .在这种情况下,覆盖 Equals/GetHashCode(如果你的 key 应该始终唯一标识这些类并且你可以访问源代码)或提供 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 中列表/项目的顺序即可查询。

关于c# - 计算两组交集和差集的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7530078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com