none
想問關於IEqualityComparer的問題.. RRS feed

  • 問題

  • 各位好..
    我想問的是為什麼關於IEqualityComparer定義的方法..
    我實作時..
    public int GetHashCode(object obj){
      return obj.ToString().GetHashCode();
    }
    假設如上述..
    請問加ToString()轉成字串用字何在??
    為什麼不是obj.GetHashCode()呢??...
    看了老半天..
    看無..
    2009年6月25日 上午 03:25

所有回覆

  • 1. 你自己實作的,那得問你自己為什麼要那樣寫吧 ...
    2. 你可以寫支小程式做實驗,程式是要用寫的和執行的,而不是用看的。
    小人物一枚。
    2009年6月25日 上午 03:38
    版主
  • 看您的範例應該是參考 MSDN : http://msdn.microsoft.com/zh-tw/library/system.collections.iequalitycomparer(VS.80).aspx

    這只是舉例, 不一定要實作這個method, 至於為什麼要這樣做? 這裡只是舉例, 內容您可以自行實作.


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年6月25日 上午 03:43
  • 我已經寫過了..
    微軟的範例我早看過了..
    可是我實在不清楚為什麼要這樣..
    MSDN也沒講太多..


    我寫的像這樣的例子..
    public class EmpNameComparer : IEqualityComparer<Sale_Tables.DataSets.CashierAchievementDataSet.spmRow>
    {
        public bool Equals(Sale_Tables.DataSets.CashierAchievementDataSet.spmRow spmRow1,
            Sale_Tables.DataSets.CashierAchievementDataSet.spmRow spmRow2)
        {
            return (spmRow1.emp_name == spmRow2.emp_name);
        }

        public int GetHashCode(Sale_Tables.DataSets.CashierAchievementDataSet.spmRow spmRow)
        {
            return spmRow.ToString().GetHashCode();
        }
    }

    我最後是要這樣..
     IEnumerable<Sale_Tables.DataSets.CashierAchievementDataSet.spmRow> rows = cashierAchievementDataSet.spm.Distinct(new EmpNameComparer());
    去掉重複的記錄...
    只是搞不懂為什麼還要再加ToString()..
    不加的話就沒辦法去掉重複了..
    這個過程是怎樣??..

    2009年6月25日 上午 03:53
  • 你應該先了解GetHashCode的用意,上Google搜尋就會有答案,但大多數都是JAVA,不過跟.Net是一樣的
    ToString(),GetType(),GetHashCode(),Equals()這四個object類別的基礎方法是每個學.Net的人都應該要了解的.
    .Net有非常多的機制都跟這四個函式有關

    當你了解GetHashCode()的用意你自然會了解IEqualityComparer的運作.

    簡單來說GetHashCode()是用來判斷物件的唯一.
    Equals除了判斷物件參考位置是否相等外,通常都會用GetHashCode()來判斷不同instance間是否相等

    舉例
    string a = "aaa";
    string b = "aaa";

    a等於b,思考一下為什麼這兩個string會相等?當你了解Equals與GetHashCode後就會有答案.


    2009年6月25日 上午 05:12
  • 看不懂?
    ReferenceEquals 這是參考相等,也就是二個物件是不是相等,只到同一個位置.
    Equals 這要看你內部的實作,看這二個物件的值是不是相等.
    GetHashCode 看你內部的演算法而算出不同的Code.
    ToString().GetHashCode(); 依文字物件去算出 HashCode.
    所以說 你沒去Override ToString()的情形下.只要這二個Object 是相同的Type產生的HashCode是相等的.
    Obj.GetHashCode(); 就算Type相同,但內部值不同,依演算法算出來後的值也不同.

    2009年6月25日 上午 05:35
  • 你舉的例子是他的string也是immutable???..
    也就是他跟java一樣有類似的String Pool機制??..

    2009年6月25日 上午 07:01