LINQ Except 引用型別 用法

2021-08-07 06:31:17 字數 3324 閱讀 1115

值型別的比較except 直接就比了

引用型別的如下:

var resultexcept = expert_itemsource.except(invert_itemsource, new mycompare()).tolist();
//比較器

public

class mycompare : iequalitycomparer

else

}public

intgethashcode(consultationexpertapimodel bx)

}

list list1 = new list();

list1.add(1);

list1.add(2);

list1.add(3);

list list2 = new list();

list2.add(3);

list2.add(4);

list2.add(5);

//得到的結果是4,5 即減去了相同的元素。

list list3 = list2.except(list1).tolist();

foreach (int i in list3)

當我們用linq操作我們自定義的對像陣列時,我們會發現有些方法直接使用的話根本不起作用,比如:distinct、except、intersect等擴充套件方法。

對於我們自定義的物件的比較,我們必須實現iequalitycomparer介面來判斷兩個物件的相等性。

示例**如下:

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace lambda

; park p2 = new park ;

park p3 = new park ;

listparks = new list(),

new park

};parks.add(p1);

parks.add(p2);

parks.add(p3);

var diff = from c in parks.distinct(new park())

select c;

foreach (var item in diff)}}

class park : iequalitycomparer

public

string address

public

int peoples

public

bool

equals(park x, park y) //比較x和y物件是否相同,按照位址比較

public

intgethashcode(park obj)

}}

下面的示例演示如何實現的相等比較器可在except方法。

public

class product

public

int code

}class productcomparer : iequalitycomparer

public

intgethashcode(product product)

}

實現此比較器後,您可以使用的序列product中的物件except方法,如下面的示例中所示。

new product ,

new product };

ienumerableexcept =

fruits1.except(fruits2, new productcomparer());

foreach (var product in except)

console.writeline(product.name + " " + product.code);

/* orange 4

lemon 12

*/gethashcode是判斷物件是否相等的快速檢查,所以gethashcode不需要太複雜,因為即使gethashcode判斷相同了,後面還有equals保證精確對比。(note:但是盡量保證gethashcode就能判斷出來,太多的hash衝突,也會增加不必要的開銷。這就要看gethashcode重寫得有沒有水平了)

理解重寫gethashcode的必要性。

建議題主了解一下雜湊和雜湊表,就會知道這個雜湊碼(hashcode)是什麼東西了。

簡而言之,雜湊**是乙個用於在相等測試過程中標識物件的數值。它還可以作為乙個集合中的物件的索引。如果兩個物件的 equals 比較結果相等,則每個物件的 gethashcode 方法都必須返回同乙個值。 如果兩個物件的比較結果不相等,這兩個物件的 gethashcode 方法不一定返回不同的值。

簡而言之,如果你發現兩個物件 gethashcode() 的返回值相等,那麼這兩個物件就很可能是同乙個物件;但如果返回值不相等,這兩個物件一定不是同乙個物件。

ordercompare oc= new ordercompare();

ienumerabledifferencesequence = orderlist1.except(orderinfolist2,oc);

if (differencesequence.any())

new sendmailhelper().sendmail("[email protected]", "郵件", null, "不一致的資料",

sbuilder.tostring());

} else

//比較器

public

class ordercompare : iequalitycomparer

if (object.referenceequals(o1, null) || object.referenceequals(o2, null))

bool flag = o1.name.equals(o2.name) && o1.age.equals(o2.age) && o1.mobile.equals(o2.mobile) && o1.home.equals(o2.home) && o1.gender.equals(o2.gender);

return flag;

}public

intgethashcode(model_orderinfo oinfo)

else

} }

5 0 引用型別

ecmascript中有5中簡單資料型別 也叫基本資料型別 undefined boolean null number string。還有一種複雜資料型別 object object本質上是一組無序的明值対組成的 1 應用型別的值 物件 是引用型別的乙個例項。2 在es種,引用型別是一種資料結構,用...

6 引用型別 Object

1 例項化物件var obj new object var obj2 給物件設定屬性 obj2.name lc obj2.女 obj2.age 23 obj2 birthday 1994 03 13 obj2.say function 訪問物件的屬性或方法 console.log obj2.name...

JavaScript程式設計(三) 引用型別

函式的屬性和方法 基本包裝型別 引用型別的值 物件 是引用型別的乙個例項,ecmascript中,引用型別是一種資料結構,用於將資料和功能組織在一起,他們常被稱為類,但是並不太準確,因為它不具備傳統的物件導向語言所支援的類和介面等基本結構。引用型別也被稱為物件定義。它描述的是一類物件所具有的屬性和方...