C# 自定义实体(类)List 复杂实体(类)List 的 Compare, 是否包含(Contains()),去重( Distinct())


对于简单数据类型的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();
/* 省略部分代码 */

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM