如何在流畅的LINQ中比较两个列表对象

本文关键字:两个 对象 列表 比较 LINQ | 更新日期: 2023-09-27 17:53:03

我有两个列表,它们有不同类型的对象

List<Type1> list1
List<Type2> list2

Type1和Type2之间唯一的共同点是Id属性和Date属性。

如何获得ID和Date属性彼此相等的项目列表?

var list3 = list1.where(x=>x.id == ??

谢谢

如何在流畅的LINQ中比较两个列表对象

如果您想使用扩展方法,您可以使用。join()方法。

var combination = list1.Join(list2, 
    l1 => new { l1.Id, l1.Date }, 
    l2 => new { l2.Id, l2.Date }, 
    (l1, l2) => Tuple.Create(l1, l2));

您可以连接多个字段,但您需要其他东西来存储它们的值。

假设其他属性在Type1Type2之间都是不同的,您将需要第三个类来存储您想要保留的信息。

var results
    = (from l1 in list1
       join l2 in list2 on new { l1.ID, l1.Date} equals new { l2.ID, l2.Date }
       select new SomeThirdClass { });

创建一个公共基类或接口,并为其实现IEqualityComparer

public class BaseClass
{
    public int Id;
    public DateTime Date;
}
class Type1: BaseClass
{

}
class Type2 : BaseClass
{

}
public class BaseClassComparer : IEqualityComparer<BaseClass>
{
    #region IEqualityComparer<BaseClass> Members
    public bool Equals( BaseClass x, BaseClass y )
    {
        return x.Id == y.Id && x.Date == y.Date;
    }
    public int GetHashCode( BaseClass obj )
    {
        return obj.GetHashCode ();
    }
    #endregion
}

然后简单地使用Intersect()和Comparer创建一个包含不同对象的合并列表。

List<Type1> t1 = new List<Type1>();
List<Type2> t2 = new List<Type2>();
var combined = t1.Intersect( t2, new BaseClassComparer() );