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.
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.
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ı.
MyObject türünün türü nedir? Düzgün olarak geçersiz bir Equals() yöntemi var mı?
Bu kullanıcı tanımlı nesne ve sadece 3 propriences, 2 string ve 1 integer var. – Tony
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. –
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.
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
Bize, İçerir yönteminin kodunu göstermeniz gerekir. – Timores
@Timores: Contains(), Listesindeki bir yöntemdir. –