匿名物件的Distinct

2021-07-24 01:11:45 字數 1419 閱讀 2082

在使用linq distinct集合的時候,匿名物件和非匿名物件的區別非常有趣。 匿名物件自動實現了gethashcode和equals方法,distinct可以自動去重。

如果使用非匿名物件,則需要該類override gethashcode()和equals(object obj)方法, 或者新增乙個實現iequalitycomparer的輔助類,作為distinct引數。

#region anonymous object

var anonymousobj1 = new

;var anonymousobj2 = new

;

trace.writeline(anonymousobj1 == anonymousobj2); // false

trace.writeline(object.referenceequals(anonymousobj1, anonymousobj2)); // false

trace.writeline(anonymousobj1.gethashcode() == anonymousobj2.gethashcode()); // true

trace.writeline(anonymousobj1.equals(anonymousobj2)); // true

#endregion

#region non-anonymous object

var classobj1 = new class1

;var classobj2 = new class1

;trace.writeline(classobj1 == classobj2); // false

trace.writeline(object.referenceequals(classobj1, classobj2)); // false

trace.writeline(classobj1.gethashcode() == classobj2.gethashcode()); // false

trace.writeline(classobj1.equals(classobj2)); // false

#endregion

// distinct

ilistlist = new list()

,new class1() ,

new class1() ,

new class1()

};// count: 4. class1 must overide gethashcode and equals method.

var result1 = list.select(p => new class1 ).distinct();

// count: 3.

var result2 = list.select(p => new ).distinct();

匿名物件和匿名類

一,匿名物件 匿名物件 沒有名字的物件 new car 匿名物件其實就是定義物件的簡寫格式。car c new car c.run 用匿名物件來書寫以上 new car run 匿名物件的使用方法 1 當物件對方法僅進行一次呼叫的時候,就可以簡化成匿名物件。如乙個 物件需要進行呼叫方法2次,用匿名物...

匿名型別與匿名物件

var匿名型別 推斷型別 var可代替任何型別,編譯器會根據上下文來判斷你到底是想用什麼型別,類似 object,但是效率比object高點。我們可以賦予區域性變數推斷 型別 var而不是顯式型別。var 關鍵字指示編譯器根據初始化語句右側的表示式推斷變數的型別。推斷型別可以是內建型別 匿名型別 使...

匿名物件?臨時物件?

關於匿名物件與臨時物件,這個概念不是絕對的,概念的區分往往十分拗口難記。要根據作用域,生存時間和用法來來決定 工作多年這些拗口的概念我從來沒有真的記住過,也沒有乙個部落格講清楚他們的區別。這裡我們參考 effective c 中得稱謂,稱之為區域性物件。但是區域性也是有範圍得。下面論證。1無名則無份...