tek yolu eşitlik için koşullar sağlandığında gerçek dönmek bool Object.Equals(object other)
geçersiz, aksi takdirde yanlış döndürmektir. Ayrıca, Equals()
'u geçersiz kıldığınızda dikkate aldığınız verilerin tümüyle hesaplanmış bir int değerini döndürmek için int Object.GetHashCode()
'u geçersiz kılmanız gerekir.
Bir kenara göre, GetHashCode()
için yapılan sözleşmenin, Equals()
karşılaştırılırken true değerini döndürürken, dönüş değeri iki nesne için eşit olması gerektiğini belirtir. Bu, return 0;
'un geçerli bir GetHashCode()
uygulaması olduğu anlamına gelir, ancak sınıfınızın nesneleri sözlük anahtarları olarak kullanıldığında veya HashSet<T>
'da depolandığında verimsizliklere neden olur.
ben eşitlik uygulamak yolu şu şekildedir:
public class Foo : IEquatable<Foo>
{
public bool Equals(Foo other)
{
if (other == null)
return false;
if (other == this)
return true; // Same object reference.
// Compare this to other and return true/false as appropriate.
}
public override bool Equals(Object other)
{
return Equals(other as Foo);
}
public override int GetHashCode()
{
// Compute and return hash code.
}
}
GetHashCode()
uygulanması basit bir yolu birlikte size Equals()
eşitlik için dikkate verilerin tümünün karma kodlarını XOR etmektir. Örneğin, sen eşitlik için karşılaştırma özellikleri string FirstName; string LastName; int Id;
eğer gibi Yani, uygulama görünebilir: Genellikle değil geçersiz kılma yapmak
public override int GetHashCode()
{
return (FirstName != null ? FirstName.GetHashCode() : 0)^
(LastName != null ? LastName.GetHashCode() : 0)^
Id; // Primitives of <= 4 bytes are their own hash codes
}
ben eşitlik ilgilendiğim çoğu zaman olduğu gibi eşitlik operatörleri, sadece sözlük anahtarlarının veya koleksiyonlarının amaçları için. Sözdizimsel olarak daha az ayrıntılı olduğu için, referans ile değere göre daha fazla karşılaştırma yapabilecek olursanız, sadece eşitlik operatörlerini geçersiz kılmayı düşünürdüm. Ancak, size nesne üzerinde ==
veya !=
kullanan tüm yerleri değiştirmek için hatırlamak zorunda (Equals()
sizin uygulanmasında dahil!) Object.ReferenceEquals()
kullanmak veya object
her iki işlenen döküm için. Bu iğrenç tuhaflık (eğer dikkatli değilseniz, eşitlik testinde sonsuz tekrarlara neden olabilir), bu operatörleri nadiren geçersiz kılmamın temel nedenlerinden biridir. Ne duymak istediğiniz cevabı olmayabilir, ama bu NET'te değer eşdeğerlik uygulamak için en iyi yol -
Nesnelerin eşit olması için koşullarınız nelerdir? – BoltClock
Temel olarak, bu dizgi üyelerindeki tüm değerler, çift üyeler ve dizi (ler) aynı olmalıdır! – siva
http://stackoverflow.com/questions/506096/comparing-object-properties-in-c adresinin olası kopyası – RameshVel