2010-03-31 20 views
5

Listede yer almayan bir şeyi tanımlamak için Contains() kullanıyorum. Yani bir şey gibi! Listenin İçerikleri() çalışmıyor

if(!list.Contains(MyObject)) 
{ 
//do something 
} 

ama, deyim MyObject zaten listede olsa bile true giderse bütün.

+0

Bize, İçerir yönteminin kodunu göstermeniz gerekir. – Timores

+1

@Timores: Contains(), Listesindeki bir yöntemdir. –

cevap

3

Eşittir'i geçersiz kılma özelliğiniz yoksa (veya istemiyorsanız), nesnenizin bir IEqualityComparer<T> uygulayabilir ve bunu, İçerir yöntemine (aşırı yükleme) ikinci parametre olarak iletebilirsiniz. Eğer nesneniz bir referans tipi ise, basitçe nesnenin içeriği yerine referansları karşılaştırıyor olabilir.

class Foo 
{ 
    public string Blah { get; set; } 
} 

class FooComparer : IEqualityComparer<Foo> 
{ 
    #region IEqualityComparer<Foo> Members 

    public bool Equals(Foo x, Foo y) 
    { 
     return x.Blah.Equals(y.Blah); 
    } 

    public int GetHashCode(Foo obj) 
    { 
     return obj.Blah.GetHashCode(); 
    } 

    #endregion 
} 

... Bu senaryoda

Foo foo = new Foo() { Blah = "Apple" }; 
Foo foo2 = new Foo() { Blah = "Apple" }; 

List<Foo> foos = new List<Foo>(); 

foos.Add(foo); 
if (!foos.Contains(foo2, new FooComparer())) 
    foos.Add(foo2); 

, foo2 listeye eklenecektir olmaz. Karşılaştırma argümanı olmazdı.

9

MyObject türünün türü nedir? Düzgün olarak geçersiz bir Equals() yöntemi var mı?

+0

Bu kullanıcı tanımlı nesne ve sadece 3 propriences, 2 string ve 1 integer var. – Tony

+0

MSDN'den: "Eşit değerlerin varsayılan uygulaması, referans türleri için referans eşitliğini destekliyor [...]. Referans eşitliği, karşılaştırılan nesne referansları aynı nesneyi ifade eder." İçindekiler(), varsayılan eşitlik karşılaştırıcısını kullanır, bu da sırasıyla Equals() (sınıfınız IEquatable'ı uygulamadığı sürece, ancak bu noktanın yanındadır) kullanır. Yani, Equals() öğesini geçersiz kılmadıysanız Contains() 'ın iyi davranış göstermesini beklemeyin. –

1

List<T> numaralı belgede bir nesne bulmak için test ediyorsanız, Contains() yöntemindeki parametrenin, listedeki gibi aynı örnek olması gerekir. İki ayrı ama özdeş örnek ise işe yaramaz.

+1

Sınıf eşitleme yöntemini geçersiz kılarsa ve bu ikincisi doğru döndürürse, aynı örnek olması gerekmez. – PierrOz

İlgili konular