2008-10-06 15 views
5
List<tinyClass> ids = new List<tinyClass(); 
ids.Add(new tinyClass(1, 2)); 

bool b = ids.IndexOf(new tinyClass(1, 2)) >= 0; //true or false? 

, doğru dönmesi gerekir; referans ile, yanlış dönecektir.
Referans ile karşılaştırır ve tinyClass'ı bir struct yaparsam - bu bir fark yaratır mı? MSDNListe <>. IndexOf referans veya değer ile karşılaştır? bu değer ile karşılaştırır halinde

+0

Veya kod örneğini çalıştırmak için ve sonucu kontrol edin;) – OregonGhost

cevap

16

:

Bu yöntem, varsayılan eşitliği karşılaştırıcısı kullanılarak eşitliği belirleyen EqualityComparer T <T> .Default, listedeki değerlerin türü. tipi T System.IEquatable <T> jenerik arabirimini uygulayıp uygulamadığını ve böylece bir EqualityComparer <T> dönerse uygulanması olduğunu kullandığı

Standart özellik denetler. Aksi takdirde kayıtlı sınıf IEquatable <T> arabirimi uygulayan sürece, eşit olarak yöntemini kullanır gibi

görünüyor T. tarafından sağlanan Object.Equals ve Object.GetHashCode geçersiz kılan kullanan bir EqualityComparer <T> döndürür.

1

Nesnenin .Equals (..) uygulamasına bağlıdır. Bir nesne için varsayılan olarak referanslar karşılaştırılır. Eğer onu bir yapıya dönüştürdüyseniz, o zaman özel üyelerin eşitliğine dayalı olarak doğruyu değerlendireceğine inanıyorum, ama IEquatable'ı uygulamak için daha programlı olarak geçerli olacaktır.

2

Bir sınıf için, Eşittir varsayılan uygulaması ile - referans ile karşılaştırılacaktır.

Bunu bir TinyStruct olarak değiştirirseniz, değeriyle karşılaştırır.

0

Yapınızın yapısı için .Equals (..) 'u uyguladığınızdan emin olun, çünkü varsayılan uygulama her alanı karşılaştırmak için çok pahalı olan yansıma kullanabilir.

Devamı için: Eşit uygulama değerleri eşitliğe dayalı olduğu için Yapılar arasında http://blogs.microsoft.co.il/blogs/sasha/archive/2007/08.aspx

0

aynı zamanda, sınıf veya yapı örneğinin hangi listede tutulur ilgili olabilir

İlgili konular