Saya mengetahui dua metode tipe casting IEnumerable
dari dari Arraylist
dalam Linq dan bertanya-tanya dalam kasus apa untuk menggunakannya?
misalnya
IEnumerable<string> someCollection = arrayList.OfType<string>()
atau
IEnumerable<string> someCollection = arrayList.Cast<string>()
Apa perbedaan antara kedua metode ini dan di mana saya harus menerapkan setiap kasus?
Cast<T>
ketika Anda tahu pasti bahwa koleksi hanya berisiT
elemen tipe .OfType<T>
lebih lambat karenais
pemeriksaan tipe. Jika koleksinya berjenisIEnumerable<T>
,Cast<T>
cukup masukkan seluruh koleksi sebagaiIEnumerable<T>
dan hindari penghitungannya;OfType<T>
masih akan disebutkan. ref: stackoverflow.com/questions/11430570/….Cast<string>()
tidak melempar ketika disebutkan, itu tidak setara dengan.OfType<string>()
. Alasannya adalah bahwanull
nilai selalu dilewati.OfType<TResult>()
. Contoh:new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()
hanya akan memberi3
; ekspresi serupa dengan.Cast<string>()
evaluate to4
.http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/
Pada dasarnya, Cast () diimplementasikan seperti ini:
Menggunakan gips eksplisit berkinerja baik, tetapi akan menghasilkan InvalidCastException jika gips gagal. Variasi yang kurang efisien namun bermanfaat pada ide ini adalah OfType ():
Pencacahan yang dikembalikan hanya akan mencakup elemen yang dapat dengan aman dilemparkan ke jenis yang ditentukan.
sumber
Anda harus menelepon
Cast<string>()
jika Anda tahu bahwa semua item adalahstring
s.Jika beberapa dari mereka bukan string, Anda akan mendapatkan pengecualian.
Anda harus menelepon
OfType<string>()
jika Anda tahu bahwa beberapa item tidakstring
dan Anda tidak ingin item itu.Jika beberapa dari mereka bukan string, mereka tidak akan di yang baru
IEnumerable<string>
.sumber
Perlu dicatat bahwa
Cast(Of T)
dapat digunakan padaIEnumerable
tidak seperti fungsi LINQ lainnya, jadi jika ada kasus di mana Anda perlu menggunakan LINQ pada koleksi atau daftar non-generik sepertiArrayList
, Anda dapat menggunakanCast(Of T)
untuk melemparkan keIEnumerable(Of T)
tempat LINQ dapat bekerja.sumber
Cast()
akan mencoba untuk membuang semua elemen koleksi (dan akan mengeluarkan pengecualian jika elemen dari tipe yang salah) sementaraOfType()
akan mengembalikan hanya elemen dengan tipe yang tepat.sumber
OfType
akan memfilter elemen untuk mengembalikan hanya yang dari tipe yang ditentukan.Cast
akan macet jika suatu elemen tidak dapat dilemparkan ke tipe target.sumber
Cast<T>
akan mencoba untuk melemparkan semua item ke jenis yang diberikanT
. Pemain ini bisa gagal atau melempar pengecualian.OfType<T>
akan mengembalikan sebagian koleksi asli dan hanya mengembalikan objek yang bertipeT
.sumber