IEqualityComparer 接口的使用

                先给出MSDN关于IEqualityComparer 接口的介绍,点击打开链接,IEqualityComparer主要适用于定义方法以支持对象的相等比较。可以实现集合的自定义相等比较。即,您可以创建自己的相等定义,并指定此定义与接受IEqualityComparer 接口的集合类型一起使用。

              IEqualityComparer 接口包含两个方法,方法


 名称说明
公共方法由 XNA Framework 提供支持受 可移植类库 支持Equals确定指定的对象是否相等。
公共方法由 XNA Framework 提供支持受 可移植类库 支持GetHashCode返回指定对象的哈希代码。

整体来说,比较好理解

Equals方法:自反的、对称的和可传递的。也就是说,如果此方法用于将某个对象与其自身比较,则它将返回true;如果对 yx 执行此方法返回 true,则对 xy 这两个对象也返回 true;如果对xy 执行此方法返回 true,并且对yz 执行此方法也返回 true,则对xz 这两个对象也返回 true

实现需要确保如果对两个对象 x y 执行 Equals 方法返回 true,则对xy 分别执行 GetHashCode 方法所返回的值必须相等。

GetHashCode方法:实现需要确保如果对两个对象xy 执行 Equals 方法返回true,则对 xy 分别执行 GetHashCode 方法所返回的值必须相等。

         当我们用Linq操作我们自定义的对象时,我们会发现有些方法直接使用的话根本不起作用,比如:Distinct、Except、Intersect等扩展方法。这是就需要定义IEqualityComparer接口来判断两个对象的相等性。

下面给出简单实例说明:

首先,我们定义一个类,类如下

 public class SellerTypeIdentify
        {
            /// <summary>
            /// 商户类型ID
            /// </summary>		
            public string SellerTypeID
            {
                get;
                set;
            }
            public string SellerName
            {
                get;
                set;
            }
        }


定义一个以SellerTypeID为基础的比较器

  public class SellerTypeIdentifyComparer : IEqualityComparer<SellerTypeIdentify>
        {
            // SellerType are equal if their names and product numbers are equal.
            public bool Equals(SellerTypeIdentify x, SellerTypeIdentify y)
            {
                //Check whether the compared objects reference the same data.
                if (Object.ReferenceEquals(x, y)) return true;

                if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
                    return false;

                return x.SellerTypeID == y.SellerTypeID;
            }
            public int GetHashCode(SellerTypeIdentify product)
            {
                //Check whether the object is null 
                if (Object.ReferenceEquals(product, null)) return 0;

                //Get hash code for the SellerTypeID field if it is not null. 
                int SellerTypeId = product.SellerTypeID == null ? 0 : product.SellerTypeID.GetHashCode();

                //Calculate the hash code for the SellerType. 
                return SellerTypeId;
            }
        }

初始化数据

public static List<SellerTypeIdentify> GetMainData()
        {
            List<SellerTypeIdentify> sellerTypeList = new List<SellerTypeIdentify>();
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000001", SellerName = "Name0001" });
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000002", SellerName = "Name0002" });
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000003", SellerName = "Name0003" });
            return sellerTypeList;
        }
        public static List<SellerTypeIdentify> GetSuppData()
        {
            List<SellerTypeIdentify> sellerTypeList = new List<SellerTypeIdentify>();
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000002", SellerName = "Name0001" });
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000001", SellerName = "Name0002" });
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000003", SellerName = "Name0003" });
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000004", SellerName = "Name0004" });
            return sellerTypeList;
        }


就拿Distinct和SequenceEqual来说

 List<SellerTypeIdentify> sellerTypeMainList = new List<SellerTypeIdentify>();
            sellerTypeMainList = Program.GetMainData();

            List<SellerTypeIdentify> sellerTypeSuppList = new List<SellerTypeIdentify>();
            sellerTypeSuppList = Program.GetSuppData();

            int mainSellerCount = sellerTypeMainList.Distinct(new SellerTypeIdentifyComparer()).Count();
            int suppSellerCount = sellerTypeSuppList.Distinct(new SellerTypeIdentifyComparer()).Count();
            List<bool> xquery = new List<bool>();
            if (suppSellerCount <= mainSellerCount)
            {
                foreach (SellerTypeIdentify s in sellerTypeSuppList.Distinct(new SellerTypeIdentifyComparer()).OrderBy(x => x.SellerTypeID))
                {
                    xquery.Add(sellerTypeMainList.OrderBy(x => x.SellerTypeID).Contains(s, new SellerTypeIdentifyComparer()));
                }
            }
            else
            {
                Console.WriteLine("NOT CONTAINS1");
            }
            if (xquery.Contains(false))
            {
                Console.WriteLine("NOT CONTAINS2");
            }
            bool IsEqual = sellerTypeMainList.OrderBy(x => x.SellerTypeID).SequenceEqual(sellerTypeSuppList.OrderBy(x => x.SellerTypeID), new SellerTypeIdentifyComparer());
            if (IsEqual)
            {
                Console.WriteLine("Equal");
            }
            else
            {
                Console.WriteLine("Not Equal");
            }


输出结果如下:


 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值