Büyük bir nesne koleksiyonu göz önüne alındığında, aşağıdakiler arasında bir performans farkı var mı?
myCollection.Contains(myElement)
Numaralandırılabilir.Herhangi bir :
myCollection.Any(currentElement => currentElement == myElement)
Büyük bir nesne koleksiyonu göz önüne alındığında, aşağıdakiler arasında bir performans farkı var mı?
myCollection.Contains(myElement)
Numaralandırılabilir.Herhangi bir :
myCollection.Any(currentElement => currentElement == myElement)
Yanıtlar:
Contains()bir örnek yöntemdir ve performansı büyük ölçüde koleksiyonun kendisine bağlıdır. Örneğin, Contains()bir ilgili Listiken, O (n) olan Contains()bir ilgili HashSetO (1) 'dir.
Any()bir genişletme yöntemidir ve sadece koleksiyondan geçerek temsilciyi her nesneye uygular. Bu nedenle O (n) karmaşıklığına sahiptir.
Any()ancak bir delege geçebileceğiniz için daha esnektir. Contains()sadece bir nesneyi kabul edebilir.
Containsaynı zamanda karşı bir genişletme yöntemidir IEnumerable<T>(bazı koleksiyonların da kendi Containsörnek yöntemi olmasına rağmen ). Sizin de söylediğiniz gibi, ona özel bir yüklem geçirebileceğinizden Anydaha esnektir Contains, ancak biraz daha hızlı Contains olabilir çünkü her öğe için bir temsilci çağrısı gerçekleştirmesi gerekmez.
All()benzer şekilde çalışır.
Koleksiyona göre değişir. Sıralı bir koleksiyonunuz varsa, Containsakıllı bir arama (ikili, karma, b-ağaç, vb.) Yapabilirsiniz, `` Herhangi biri () ile temelde onu bulana kadar numaralandırmaya bağlı kalırsınız (LINQ-to-Objects varsayarak) .
Ayrıca, örneğinizde, referans eşitliğini kontrol edecek operatörü Any()kullandığınızı, kullanırken veya yöntemi geçersiz kılınabileceğini unutmayın.==ContainsIEquatable<T>Equals()
Sanırım bu, myCollectionnasıl Contains()uygulandığını belirleyen şeyin türüne bağlı olacaktır . Örneğin sıralı bir ikili ağaç ise daha akıllıca arama yapabilir. Ayrıca elemanın hash değerini de hesaba katabilir. Any()Öte yandan, koşulu karşılayan ilk öğe bulunana kadar koleksiyon boyunca numaralandırılacaktır. Nesnenin daha akıllı bir arama yöntemine sahip olup olmadığı konusunda hiçbir optimizasyon yoktur.
Contains (), doğru şekilde kullanırsanız hızlı çalışabilen bir genişletme yöntemidir. Örneğin:
var result = context.Projects.Where(x => lstBizIds.Contains(x.businessId)).Select(x => x.projectId).ToList();
Bu, sorguyu verecek
SELECT Id
FROM Projects
INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item
Öte yandan, Any () ise her zaman O (n) ile yineleme yapar.
Umarım bu işe yarar ....