SORU
4 Kasım 2010, PERŞEMBE


'IEqualityComparer< içinde GetHashCode rolü s;T> ne .NET?

Arabirim IEqualityComparer bu GetHashCode yöntemi rolünü anlamaya çalışıyorum.

Aşağıdaki örnek, MSDN alınır:

using System;
using System.Collections.Generic;
class Example {
    static void Main() {
        try {

            BoxEqualityComparer boxEqC = new BoxEqualityComparer();

            Dictionary<Box, String> boxes = new Dictionary<Box,
                                                string>(boxEqC);

            Box redBox = new Box(4, 3, 4);
            Box blueBox = new Box(4, 3, 4);

            boxes.Add(redBox, "red");
            boxes.Add(blueBox, "blue");

            Console.WriteLine(redBox.GetHashCode());
            Console.WriteLine(blueBox.GetHashCode());
        }
        catch (ArgumentException argEx) {

            Console.WriteLine(argEx.Message);
        }
    }
}

public class Box {
    public Box(int h, int l, int w) {
        this.Height = h;
        this.Length = l;
        this.Width = w;
    }
    public int Height { get; set; }
    public int Length { get; set; }
    public int Width { get; set; }
}

class BoxEqualityComparer : IEqualityComparer<Box> {

    public bool Equals(Box b1, Box b2) {
        if (b1.Height == b2.Height & b1.Length == b2.Length
                            & b1.Width == b2.Width) {
            return true;
        }
        else {
            return false;
        }
    }

    public int GetHashCode(Box bx) {
        int hCode = bx.Height ^ bx.Length ^ bx.Width;
        return hCode.GetHashCode();
    }
}

Yöntem uygulaması iki Kutu nesneleri karşılaştırmak için yeterli Eşit olması gerekmez mi? Bu çerçeve kural nesneleri karşılaştırmak için kullanılan söylüyoruz. Neden GetHashCode gerekli?

Teşekkürler.

Lucian

CEVAP
4 Kasım 2010, PERŞEMBE


Arka plan biraz önce...

Her nesne .NET Eşittir yöntem ve GetHashCode yöntemi vardır.

Yöntem - eğer iki nesne eşdeğer olup olmadığını görmek için başka bir nesne ile bir nesne karşılaştırmak için kullanılır Eşittir.

GetHashCode yöntemi nesnenin 32-bit tamsayı gösterimini oluşturur. Ne kadar bir nesne içerebilir sınırı yok bu belli hash kodları birden çok nesneler tarafından paylaşılır, karma kodu mutlaka benzersiz değil.

Bir sözlük (daha fazla veya daha az) maliyetleri Ekleyin sürekli operasyonlar Al//Kaldır karşılığında daha yüksek bir bellek ayak izi esnaf gerçekten harika bir veri yapısıdır. Ama üzerinde yineleme için kötü bir seçimdir. DAHİLİ olarak, bir sözlük değerleri saklanabilir nerede kovalar bir dizi içerir. Bir sözlük için Anahtar ve bir Değer eklediğinizde, GetHashCode yöntemi Anahtar denir. Bu hashcode döndü hangi Anahtar/Değer çifti saklanmalıdır kova dizini belirlemek için kullanılır.

Değeri erişmek istediğinizde, Tuşa tekrar iletin. GetHashCode yöntemi Anahtar olarak adlandırılır ve kova Değeri içeren yer almaktadır.

Bir IEqualityComparer bir sözlük kurucu geçirildiğinde, IEqualityComparer.Eşit ve IEqualityComparer.GetHashCode yöntemlerini Anahtar nesneleri yöntemleri yerine kullanılır.

Şimdi her iki yöntem neden gerekli olduğunu açıklamak için bu örneği ele alalım

BoxEqualityComparer boxEqC = new BoxEqualityComparer(); 

Dictionary<Box, String> boxes = new Dictionary<Box, string>(boxEqC); 

Box redBox = new Box(100, 100, 25);
Box blueBox = new Box(1000, 1000, 25);

boxes.Add(redBox, "red"); 
boxes.Add(blueBox, "blue"); 

Bu BoxEqualityComparer kullanarak.Örnek GetHashCode yöntemi, bu kutuların her ikisi de açıkça aynı nesne olsa bile, aynı hashcode - = = ^25 1000^1000^25 100^100 25 - var. Bu durumda aynı hashcode olduklarını sebebi 100 ^ 100 mu 1000^1000 olarak sıfır bırakarak iptal eder, yani^(özel VEYA) bit operatörü kullanıyorsunuz çünkü. İki farklı nesne aynı anahtara sahip olduğunda, bu bir çarpışma diyoruz.

Biz bir sözlük için aynı hashcode ile iki Anahtar/Değer çiftleri eklemek için, her ikisi de aynı kova içinde saklanır. Bir Değeri almak istediğimizde, GetHashCode yöntemi anahtarımızı kova bulmak için denir. Kova birden fazla değeri olmadığı için, sözlük kova Anahtar/Değer çiftleri tüm Tuşlara yöntem doğru bulmak için Eşittir arama yineler.

Deftere örnekte, iki kutu yöntemi true değerini döndürür Eşittir yani eşdeğerdir. Bu durumda sözlük iki özdeş Anahtarları vardır, bir istisna atar.

TLDR

Yani özetle, GetHashCode yöntemi nesnenin saklandığı adresi oluşturmak için kullanılır. Bir sözlük aramak zorunda kalmaz. Sadece hashcode hesaplar ve bu konuma atlar. Bu yöntem, eşitlik, daha iyi bir test olduğunu Eşittir, ancak bir adres içine bir nesne alanı eşlemek için kullanılır.

Bu yardımcı olur umarım

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • akalyne

    akalyne

    13 Mayıs 2009
  • MikeyMacintosh

    MikeyM

    28 Aralık 2009
  • MyCyberAcademy

    MyCyberAcade

    2 EKİM 2011