欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 實現(xiàn)Distinct將對象按條件去重

 更新時間:2020年12月07日 10:52:06   作者:lishuangquan1987  
這篇文章主要介紹了C# 實現(xiàn)Distinct將對象按條件去重,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

平時,我們將c#中的Distinct大多用于對數(shù)組去重,一般數(shù)組為基礎(chǔ)的數(shù)據(jù)類型,例如 int,string.也可以用于對象去重,我們看看C#對Distinct方法的定義:

有重載,第一個參數(shù)都加了this,是拓展方法,有關(guān)拓展方法,請百度了解。

下面我們來研究下Distinct的對象去重,假設(shè)我們現(xiàn)在有一個People類:

 public class People
 {
  public int ID { get; set; }
  /// <summary>
  /// 姓名
  /// </summary>
  public string Name { get; set; }
  /// <summary>
  /// 所屬省份
  /// </summary>
  public string Province { get; set; }
  /// <summary>
  /// 年齡
  /// </summary>
  public int Age { get; set; }
  public override string ToString()
  {
   return string.Format("ID:{0} Name:{1} Province:{2} Age:{3}", ID, Name, Province, Age);
  }
 }

我們聲明一個ListPeole對象集合:

People p = new People() { ID = 100, Name = "liu", Province = "廣東", Age = 100 };
People p1 = p;
People p2 = p1;
IEnumerable<People> ListPeople = new List<People>()
{
 p,
 p1,
 p2,
 new People(){ID=0,Name="li",Province="湖北",Age=20},
 new People(){ID=0,Name="li",Province="湖北",Age=20},
 new People(){ID=1,Name="li",Province="湖北",Age=20},
 new People(){ID=1,Name="li",Province="湖南",Age=20},
 new People(){ID=2,Name="li",Province="湖北",Age=20},
 new People(){ID=3,Name="li",Province="湖南",Age=21},
 new People(){ID=4,Name="li",Province="湖北",Age=22},
};

我們來對ListPeople使用Distinct方法,不帶任何參數(shù),運行結(jié)果如下:

可以看到,Distinct方法沒有帶參數(shù)的話,將對象集合中p,p1,p2進行去重,而對于對象的成員值是一樣的不同對象沒有去重,說明Distinct方法不加參數(shù)的話,去重的規(guī)則是比較對象集合中對象的引用是否相同,如果相同,則去重,否則不去重。

現(xiàn)在我們有個需求,對于ID相同的People,我們算做同一個人,要輸出集合中不重復(fù)的人(對于ID相同的隨便輸出一個即可),這時,我們用到了Distinct的第二個方法,方法要求傳入的參數(shù)是IEqualityComparer類型,繼承一個泛型接口,我們加入如下代碼:

 public class PeopleCompareByID : IEqualityComparer<People>
 {
  public bool Equals(People x, People y)
  {
   if (x == null || y == null)
    return false;
   if (x.ID == y.ID)
    return true;
   else
    return false;
  }

  public int GetHashCode(People obj)
  {
   if (obj == null)
    return 0;
   else
    return obj.ID.GetHashCode();
  }
 }

繼承IEqualityComparer接口必須實現(xiàn)Equals和GetHashCode方法。

我們比較的時候,傳入一個PeopleCompareByID 的實體即可:

ListPeople.Distinct(new PeopleCompareByID()).ToList().ForEach(x => Console.WriteLine(x));

運行結(jié)果如下:

達到了我們以ID去重的效果。

現(xiàn)在需求又變,ID和省份相同的算同一個人,要輸出人的信息(相同的隨便輸出一個即可),這個時候,我們看到ID=0和Province="湖北"的存在重復(fù),要將其去重,我們再來一個類,還是繼承自IEqualityComparer:

 public class PeopleCompareByIDAndProvince : IEqualityComparer<People>
 {
  public bool Equals(People x, People y)
  {
   if (x == null || y == null)
    return false;
   if (x.ID == y.ID&&x.Province==y.Province)
    return true;
   else
    return false;
  }

  public int GetHashCode(People obj)
  {
   if (obj == null)
    return 0;
   else
    return obj.ID.GetHashCode()^obj.Province.GetHashCode();
  }
 }

同樣,使用Distinct方法的時候,傳入PeopleCompareByIDAndProvince 的實例:

ListPeople.Distinct(new PeopleCompareByIDAndProvince()).ToList().ForEach(x => Console.WriteLine(x));

運行后的結(jié)果如下:

新增:1.類的某個屬性是list數(shù)組,按照這個list的引用是否相同來判斷是否是同一個對象

我們再來修改一下上面的代碼如下:

 class Program
 {
  static void Main(string[] args)
  {
   List<int> list = new List<int>() { 1, 2, 11, 222, 3, 4 };
   List<int> list1 = new List<int>() { 1, 2, 11, 222, 3, 4 };
   People p1 = new People() { Name = "Tony1", ID = 1, Age = 18, Members = list };
   People p2 = new People() { Name = "Tony2", ID = 2, Age = 19, Members = list };
   People p3 = new People() { Name = "Tony3", ID = 3, Age = 20, Members = list1 };
   People p4 = new People() { Name = "Tony4", ID = 4, Age = 21, Members = new List<int>() };
   List<People> personList = new List<People>() { p1, p2,p2,p3,p4 };
   personList.Distinct(new PeopleComparedByList()).ToList().ForEach(x => Console.WriteLine(x));
   Console.Read();
  }
 }
 public class People
 {
  public int ID { get; set; }
  /// <summary>
  /// 姓名
  /// </summary>
  public string Name { get; set; }
  /// <summary>
  /// 所屬省份
  /// </summary>
  public string Province { get; set; }
  /// <summary>
  /// 年齡
  /// </summary>
  public int Age { get; set; }
  private List<int> members = new List<int>();
  public List<int> Members
  {
   get { return members; }
   set { members = value; }
  }
  public override string ToString()
  {
   return string.Format("ID:{0} Name:{1} Province:{2} Age:{3},Members:{4}", ID, Name, Province, Age,string.Join("-",this.Members.ToList()));
  }
 }
 public class PeopleComparedByList : IEqualityComparer<People>
 {
  public bool Equals(People x, People y)
  {
   if (x.Members == y.Members)
    return true;
   else
    return false;
  }

  public int GetHashCode(People obj)
  {
   return obj.Members.GetHashCode();
  }
 }

運行的結(jié)果如下:

從結(jié)果可以看到,Tony1,Tony2的Members屬性是一個同一個引用的list,所以去重復(fù)的時候把Tony2給去掉了

達到了我們想要的效果。

新增:2.類的某個屬性是list數(shù)組,按照這個list的各元素的值是否相同來判斷是否是同一個對象

我們來新增加一個比較器:

public class PeopleComparedByListValue : IEqualityComparer<People>
 {
  public bool Equals(People x, People y)
  {
   if (x.Members == null && y.Members == null)
    return true;
   if (x.Members == null || y.Members == null)
    return false;
   if (x.Members.Count != y.Members.Count)
    return false;
   //循環(huán)比較值
   for (int i = 0; i < x.Members.Count; i++)
   {
    if (x.Members[i] != y.Members[i])
     return false;
   }
   return true;
  }

  public int GetHashCode(People obj)
  {
   var hashCode = 1;
   if (obj.Members == null)
    return 0;
   if (obj.Members.Count == 0)
    return 1;
   obj.Members.ForEach(x => hashCode ^= x);
   return hashCode;   
  }
 }

使用這個比較器:

static void Main(string[] args)
  {
   List<int> list = new List<int>() { 1, 2, 11, 222, 3, 4 };
   List<int> list1 = new List<int>() { 1, 2, 11, 222, 3, 4 };
   People p1 = new People() { Name = "Tony1", ID = 1, Age = 18, Members = list };
   People p2 = new People() { Name = "Tony2", ID = 2, Age = 19, Members = list };
   People p3 = new People() { Name = "Tony3", ID = 3, Age = 20, Members = list1 };
   People p4 = new People() { Name = "Tony4", ID = 4, Age = 21, Members = new List<int>() };
   List<People> personList = new List<People>() { p1, p2,p2,p3,p4 };
   personList.Distinct(new PeopleComparedByListValue()).ToList().ForEach(x => Console.WriteLine(x));
   Console.Read();
  }

運行結(jié)果:

可以看到,數(shù)組值為1, 2, 11, 222, 3, 4 的只剩下一個了,達到了按值相同去重復(fù)的效果。

以后遇到以三個或者四個甚至更多的對象成員來決定對象是否重復(fù)的去重問題時,可以采用這種方法。

以上為個人拙見。這篇C# 實現(xiàn)Distinct將對象按條件去重就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#中讀寫INI配置文件的方法

    C#中讀寫INI配置文件的方法

    這篇文章主要介紹了C#中讀寫INI配置文件的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • C#各種異常處理方式總結(jié)

    C#各種異常處理方式總結(jié)

    這篇文章介紹了C#各種異常的處理方式,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • WPF開發(fā)之實現(xiàn)一種三軸機械手控件

    WPF開發(fā)之實現(xiàn)一種三軸機械手控件

    這篇文章主要為大家詳細介紹了如何利用WPF實現(xiàn)簡單一種三軸機械手控件,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-01-01
  • Unity實現(xiàn)識別圖像中主體及其位置

    Unity實現(xiàn)識別圖像中主體及其位置

    EasyDL基于飛槳開源深度學(xué)習(xí)平臺,面向企業(yè)AI應(yīng)用開發(fā)者提供零門檻AI開發(fā)平臺,實現(xiàn)零算法基礎(chǔ)定制高精度AI模型。本文將利用Unity和EasyDL實現(xiàn)識別圖像中主體及其位置,感興趣的可以了解一下
    2022-02-02
  • C#圖形編程GDI+基礎(chǔ)介紹

    C#圖形編程GDI+基礎(chǔ)介紹

    這篇文章介紹了C#中的圖形編程GDI+,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • C#算法之兩數(shù)之和

    C#算法之兩數(shù)之和

    這篇文章介紹了C#算法之兩數(shù)之和,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • C# ArrayList、HashSet、HashTable、List、Dictionary的區(qū)別詳解

    C# ArrayList、HashSet、HashTable、List、Dictionary的區(qū)別詳解

    這篇文章主要介紹了C# ArrayList、HashSet、HashTable、List、Dictionary的區(qū)別的相關(guān)知識點內(nèi)容,有需要朋友們參考下。
    2019-08-08
  • C# 格式化JSON的兩種實現(xiàn)方式

    C# 格式化JSON的兩種實現(xiàn)方式

    本文主要介紹了C# 格式化JSON的兩種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C#基于UDP實現(xiàn)的P2P語音聊天工具

    C#基于UDP實現(xiàn)的P2P語音聊天工具

    這篇文章主要是一個應(yīng)用,使用udp傳送語音和文本等信息。在這個系統(tǒng)中沒有服務(wù)端和客戶端,相互通訊都是直接相互聯(lián)系的,能夠很好的實現(xiàn)效果
    2015-09-09
  • C#使用ThoughtWorks.QRCode生成二維碼

    C#使用ThoughtWorks.QRCode生成二維碼

    ThoughtWorks.QRCode是一款功能強勁的動態(tài)鏈接庫,能夠為.net應(yīng)用生成二維碼,這篇文章主要為大家詳細介紹了C#使用ThoughtWorks.QRCode生成二維碼的具體方法,需要的可以參考下
    2024-04-04

最新評論