C#-可比较对象列表之间的交集

C#-可比较对象列表之间的交集,c#,collections,C#,Collections,如何从两个都实现IComparable的对象列表中找到相交对象 public List<T> Intersect<T>(List<T> list1, List<T> list2) where T : IComparable<T> { return ... ; } public List Intersect(List list1,List list2),其中T:i可比较{ 返回; } 类似这样的东西 public List<

如何从两个都实现IComparable的对象列表中找到相交对象

public List<T> Intersect<T>(List<T> list1, List<T> list2) where T : IComparable<T> {
    return ... ;
}
public List Intersect(List list1,List list2),其中T:i可比较{
返回;
}
类似这样的东西

public List<T> Intersetc<T>(List<T> list1, List<T> list2) where T : IComparable<T>
{
    return list1.Intersect(list2, new MyEqualityComparer<T>()).ToList();
}

public class MyEqualityComparer<T> : IEqualityComparer<T> where T : IComparable<T>
{
    public bool Equals(T t1, T t2)
    {
        return t1.CompareTo(t2) == 0;
    }

    public int GetHashCode(T t)
    {
        return 0;
    }
}
public List intersectc(List list1,List list2),其中T:i可比较
{
返回list1.Intersect(list2,newmyequalitycomparer()).ToList();
}
公共类MyQualityComparer:IEqualityComparer其中T:IComparable
{
公共布尔等于(t1,t2)
{
返回t1.CompareTo(t2)==0;
}
公共整数GetHashCode(T)
{
返回0;
}
}
类似这样的东西

public List<T> Intersetc<T>(List<T> list1, List<T> list2) where T : IComparable<T>
{
    return list1.Intersect(list2, new MyEqualityComparer<T>()).ToList();
}

public class MyEqualityComparer<T> : IEqualityComparer<T> where T : IComparable<T>
{
    public bool Equals(T t1, T t2)
    {
        return t1.CompareTo(t2) == 0;
    }

    public int GetHashCode(T t)
    {
        return 0;
    }
}
public List intersectc(List list1,List list2),其中T:i可比较
{
返回list1.Intersect(list2,newmyequalitycomparer()).ToList();
}
公共类MyQualityComparer:IEqualityComparer其中T:IComparable
{
公共布尔等于(t1,t2)
{
返回t1.CompareTo(t2)==0;
}
公共整数GetHashCode(T)
{
返回0;
}
}
为什么不简单地:

    public List<T> Intersect<T>(List<T> list1, List<T> list2) where T : IComparable<T>
    {
        var intersect = list1.Intersect(list2);
        return intersect.ToList();
    }
public List Intersect(List list1,List list2),其中T:i可比较
{
var intersect=list1.intersect(list2);
返回intersect.ToList();
}
为什么不简单地:

    public List<T> Intersect<T>(List<T> list1, List<T> list2) where T : IComparable<T>
    {
        var intersect = list1.Intersect(list2);
        return intersect.ToList();
    }
public List Intersect(List list1,List list2),其中T:i可比较
{
var intersect=list1.intersect(list2);
返回intersect.ToList();
}

嗯,你试过什么了吗?一个相当简单的选择是创建一个
IEqualityComparer
,它使用
CompareTo
检查相等性,然后只使用LINQ的
Intersect
方法……嗯,你试过什么了吗?一个相当简单的选择是创建一个
IEqualityComparer
,它使用
CompareTo
检查相等性,然后只使用LINQ的
Intersect
方法……有可能
GetHashCode
返回不同的值,而
CompareTo
仍然返回0这是真的。更新了答案。我的意思是,在某些情况下,
t1.CompareTo(t2)==0
,但
MyEqualityComparer.GetHashCode()
返回不同的值,因此将不会调用
MyEqualityComparer.Equals
。只需检查Intersect的实现,您是对的。在这种情况下,代码不会返回预期结果。如果在
MyQualityComparer.GetHashCode
中返回一个常量值(例如0),则将强制每次调用
MyQualityComparer.Equals
。可能
GetHashCode
返回不同的值,但仍
CompareTo
返回0这是真的。更新了答案。我的意思是,在某些情况下,
t1.CompareTo(t2)==0
,但
MyEqualityComparer.GetHashCode()
返回不同的值,因此将不会调用
MyEqualityComparer.Equals
。只需检查Intersect的实现,您是对的。在这种情况下,代码不会返回预期结果。如果在
MyQualityComparer.GetHashCode
中返回常量值(例如0),则将强制每次调用
MyQualityComparer.Equals
。它不使用IComparable进行比较。它不使用IComparable进行比较。