1. 程式人生 > 其它 >C# 自定義實體(類)List 複雜實體(類)List 的 Compare, 是否包含(Contains()),去重( Distinct())

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();
/* 省略部分程式碼 */
斬後知