对于简单数据类型的List,检查是否包含某个值,或去重可以直接使用List的方法Contains()或Distinct()。
但是对于 自定义实体(类)的List 进行是否包含实体(Contains)的检查,或者去重(Distinct)操作时,直接使用Contains()或Distinct()方法是不能达到效果的。
此时需要我们定义一个专门处理当前自定义实体(类)的这些操作的一个类。为了方便起见,一般将这两个类(自定义的实体(类),处理这个自定义类的类) 放在一起(当然完全可以不放在一起,只要自己方便查找、管理即可)。
示例代码:
实体:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; namespace BusinessInvestment { /// <summary> /// 自定义实体 /// </summary> public class ContractProjIndustryTotalInvestDto { /// <summary> /// 行业 /// </summary> public string Industry { get; set; } /// <summary> /// 行业名称 /// </summary> public string IndustryName { get; set; } /// <summary> /// 总投资 /// </summary> public decimal? TotalInvest { get; set; } } //用来处理 ContractProjIndustryTotalInvestDto 类的类,需要继承 IEqualityComparer接口,这个接口需要引用 System.Collections.Generic 命名空间 public class ContractProjIndustryTotalInvestDtoComparer : IEqualityComparer<ContractProjIndustryTotalInvestDto> { public bool Equals(ContractProjIndustryTotalInvestDto x, ContractProjIndustryTotalInvestDto y) { if (x == null || y == null) return false; if (x.Industry == y.Industry && x.IndustryName==y.IndustryName)//自定义的比较的方法,这里就是核心了 return true; else return false; } public int GetHashCode(ContractProjIndustryTotalInvestDto obj) { if (obj == null) return 0; else return obj.IndustryName.GetHashCode(); } } }
应用:
/* 省略部分代码 */ // originalDataList 为原始数据 List<ContractProjIndustryTotalInvestDto> tempDataList = new List<ContractProjIndustryTotalInvestDto>(); for (int i = 0; i < originalDataList.Count; i++) { var currentTempData = originalDataList[i]; //判断 tempDataList 列表是否包含当前循环的实体(Contains()) var isContains=tempDataList.Contains(currentTempData,new ContractProjIndustryTotalInvestDtoComparer()); if (!isContains) { /* 省略部分代码 */ tempDataList.Add(currentTempData); /* 省略部分代码 */ } } //对 tempDataList 列表去重(Distinct()) var retData = tempDataList.Distinct(new ContractProjIndustryTotalInvestDtoComparer()).ToList(); /* 省略部分代码 */