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 List
iken, O (n) olan Contains()
bir ilgili HashSet
O (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.
Contains
aynı 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 Any
daha 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, Contains
akı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.==
Contains
IEquatable<T>
Equals()
Sanırım bu, myCollection
nası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 ....