1. 程式人生 > >C# LINQ去重複雜型別物件集合

C# LINQ去重複雜型別物件集合

通過使用LINQ方法語法中的Distinct(),可以去重簡單型別集合,如:int、string等。

但如果要去重複雜型別集合,那麼 直接呼叫Distinct()方法是不行的。幸運的是,Distinct()方法可以新增自定義比較方式,簡單型別的去重無非就是型別比較,因為型別簡單索性.NET就幫我們直接實現了,但複雜型別就不行了,一般複雜型別都是自定義的,比如類、結構體等,對此我們只需要自己實現一個繼承IEqualityComparer<T>介面的比較方法,然後新增到Distinct()中即可。

上程式碼:

自定義複雜型別:

class Student
{
        private int _id;
        private string _name;
        public int ID
       {
               get{return _id;}
               set{_id = value;}
        }
         public string Name
        {
                get{return _name;}
                set{_name = value;}
         }
         public Student(int i,string s)
         {
                 _id = i;
                 _name = s;
          }
}
實現繼承IEqualityComparer<T>介面的比較方法:
class StudentCompare: IEqualityComparer<Student>
    {
         
        public bool Equals(Student x, Student y)
        {
            if (x.ID== y.ID&& x.Name== y.Name)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
 
        public int GetHashCode(item obj)
        {
		if(obj == null)
                       return 0;
                else
                       return obj.ToString().GetHashCode();
        }
    }


Distinct()中使用即可:
static void Main(string[] args)
{
           List<Student> list = new List<Student>()
            {
                new Student() { ID = 1, Name = "Tom" },
                new Student() { ID = 2, Name = "Jim" },
                new Student() { ID = 1, Name = "Tom" },
                new Student() { ID = 3, Name = "Jon" }
          };
             
 
            var temp = list.Distinct(new StudentCompare()).ToList();
 
            foreach (var item in temp)
            {
                Console.WriteLine("{0} {1}",item.ID,item.Name);
            }
            Console.Read();
}

第二種方法:

t = t.Where(s => t.Where(a => s.id == a.id && s.name == a.name).Count() > 1).Distinct().ToList();



相關推薦

C# LINQ複雜型別物件集合

通過使用LINQ方法語法中的Distinct(),可以去重簡單型別集合,如:int、string等。但如果要去重複雜型別集合,那麼 直接呼叫Distinct()方法是不行的。幸運的是,Distinct()方法可以新增自定義比較方式,簡單型別的去重無非就是型別比較,因為型別簡單

c# List

pre ring c# pub class rem string div () public static void Purge(ref List<string> needToPurge) { for (int i

C++ vector 交集 並集

原文: yongh701 https://blog.csdn.net/yongh701/article/details/51406458 C++雖然對vector封裝了大量的函式,比如判斷元素是否在vector中find、去重的unique,還有在algorithm類中對兩

ES6陣列的方法(方法集合)

方法一: function unique(arr) { const res = new Map(); return arr.filter((a) => !res.has(a) &

C++陣列

基本方法:定義一個新陣列,然後將元素組一一和新陣列的元素對比,若不同則存放在新陣列中。 #include <iostream> using namespace std; int main() { int a[10] = { 0,1,1,0,2,3,2,4

HashSet中儲存複雜型別物件

 這個話題還是從一個有問題的程式碼中引申出來的,原始碼如下: import java.util.*; class TreeSetTest {     public static void main(String[] args)     {         HashSet

C語言的一些複雜型別宣告

一些比較複雜的宣告例項(C Primer Plus中的例子) 陣列後面的[]和函式名後面的()具有相同的優先順序,它們比*的優先順序高。 都是從左往右結合。 int board[8][8]; int ** ptr; //一個指向指標的指標,每個

兩個list集合,一個list集合

/** * 集合的去重 * @param list1 要保留的集合 * @param list2 * @return */ public static List<String> removeAll(List<S

JSON陣列,list陣列物件進行

js對json陣列去重 /* * JSON陣列去重 * @param: [array] json Array * @param: [string] 唯一的key名,根據此鍵名進行去重 */ uniqueArray:function (array, k

c# ArrayList

注: 1.第一部分是昨天寫的,未深入探討Arraylist機制(雖然現在理解的也不多); 2.第二部分是今天在做完水準網間接平差後的操作。因為去重在網上沒找到合適的方案,於是自己做了實驗,簡單總結了下Arraylist的去重操作。

陣列,根據物件屬性

var arry=[{   name:"zhangsan",   age:12 },{   name:"zhangsan",   age:12 },{   name:"lisi",   age:12 },{   name:"wangwu",   age:12 }] var

C# List的三種方法(轉)

sta string duplicate lambda表達式 nts linq pac distinct fontsize 三種去重的方法 1、List中的元素實現IEquatabe接口,並提供Equals方法和GetHashCode方法。 2、使用表達式 [csha

一個關於Linq對引用型別元素集合問題的思考

背景 說到對集合去重處理,第一時間想到的肯定是Linq的Distinct擴充套件方式,對於一般的值型別集合去重,很好處理,直接list.Distinct()即可。但是如果想要對一個引用型別的集合去重(屬性值都相同就認為重複),就會發現,直接Distinct()是不行的: public class User

【轉】C# Linq 交集、並集、差集、

log .cn pre tin nio clas int except post 轉自: https://www.cnblogs.com/wdw31210/p/4167306.html using System.Linq; List<string&

C# List集合使用lambda表達式

重復 center font per aci clas select pad -a name age sex Lucy 22 woman Lily 23 woman Tom 24 man Lucy 22 woman Lily 23 woman

c# 自動實現屬性 隱式型別 物件集合初始化 匿名型別

Demo  using System; using System.Collections.Generic; namespace IntelligentCompiling { class Program { static void Main(str

C# List集合使用lambda表示式

name age sex Lucy 22 woman Lily 23 woman Tom 24 man

集合集合元素為引用型別)--- java 8 新特性 --- 根據元素單屬性、多屬性實現

1. 程式碼寫法: (要求 JDK 1.8 或 1.8 以上) package gentle.entity; import lombok.Data; /** * * @author sile

js對數組裡的基礎型別物件

1. 單元素去重 //1. 雙重迴圈去重 var array = [1, 1, '1', '1',NaN,NaN]; function unique(array) { // res用來儲存結果

C# Linq 交集、並集、差集、

using System.Linq; List<string> ListA = new List<string>(); List<string> ListB = new List<string>(); List<string> ListRe