Dengan banyaknya koleksi objek, apakah ada perbedaan performa antara berikut ini?
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)
Dengan banyaknya koleksi objek, apakah ada perbedaan performa antara berikut ini?
myCollection.Contains(myElement)
myCollection.Any(currentElement => currentElement == myElement)
Jawaban:
Contains()
adalah metode instance, dan kinerjanya sangat bergantung pada koleksi itu sendiri. Misalnya, Contains()
pada a List
adalah O (n), sedangkan Contains()
pada a HashSet
adalah O (1).
Any()
adalah metode ekstensi, dan hanya akan melalui koleksi, menerapkan delegasi pada setiap objek. Oleh karena itu, ia memiliki kompleksitas O (n).
Any()
lebih fleksibel namun karena Anda dapat mengoper delegasi. Contains()
hanya dapat menerima suatu objek.
Contains
juga merupakan metode ekstensi terhadap IEnumerable<T>
(meskipun beberapa koleksi memiliki Contains
metode contoh sendiri juga). Seperti yang Anda katakan, Any
lebih fleksibel daripada Contains
karena Anda bisa meneruskan predikat khusus, tetapi Contains
mungkin sedikit lebih cepat karena tidak perlu melakukan pemanggilan delegasi untuk setiap elemen.
All()
beroperasi dengan cara yang sama.
Itu tergantung pada koleksinya. Jika Anda memiliki koleksi yang dipesan, makaContains
mungkin melakukan pencarian cerdas (biner, hash, b-tree, dll.), Sedangkan dengan `Any () Anda pada dasarnya terjebak dengan enumerasi sampai Anda menemukannya (dengan asumsi LINQ-to-Objects) .
Perhatikan juga bahwa dalam contoh Anda, Any()
menggunakan ==
operator yang akan memeriksa persamaan referensial, sementara Contains
akan menggunakan IEquatable<T>
atau Equals()
metode, yang mungkin ditimpa.
Saya kira itu akan tergantung pada jenis myCollection
is yang menentukan bagaimana Contains()
diimplementasikan. Jika pohon biner diurutkan misalnya, itu bisa mencari lebih pintar. Juga dapat memperhitungkan hash elemen. Any()
di sisi lain akan melakukan pencacahan melalui koleksi sampai elemen pertama yang memenuhi kondisi ditemukan. Tidak ada pengoptimalan jika objek memiliki metode pencarian yang lebih cerdas.
Contains () juga merupakan metode ekstensi yang dapat bekerja cepat jika Anda menggunakannya dengan cara yang benar. Misalnya:
var result = context.Projects.Where(x => lstBizIds.Contains(x.businessId)).Select(x => x.projectId).ToList();
Ini akan memberikan kueri
SELECT Id
FROM Projects
INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item
sedangkan Any () di sisi lain selalu melakukan iterasi melalui O (n).
Semoga ini berhasil ....