Saya telah mendefinisikan yang berikut ini:
public ICollection<Item> Items { get; set; }
Ketika saya menjalankan kode ini:
Items = _item.Get("001");
Saya mendapatkan pesan berikut:
Error 3
Cannot implicitly convert type
'System.Collections.Generic.IEnumerable<Storage.Models.Item>' to
'System.Collections.Generic.ICollection<Storage.Models.Item>'.
An explicit conversion exists (are you missing a cast?)
Adakah yang bisa menjelaskan kesalahan saya. Saya sangat bingung tentang perbedaan antara Enumerable, Collections dan menggunakan ToList ()
Informasi tambahan
Nanti di kode saya, saya memiliki yang berikut:
for (var index = 0; index < Items.Count(); index++)
Apakah saya boleh mendefinisikan Item sebagai IEnumerable?
public IEnumerable<Item> Items { get; set; }
Apakah Anda punya alasan khusus untuk memilikinyaICollection
?Jawaban:
ICollection<T>
mewarisi dariIEnumerable<T>
sehingga untuk menetapkan hasilIEnumerable<T> Get(string pk)
ke
ICollection<T>
ada dua cara.// 1. You know that the referenced object implements `ICollection<T>`, // so you can use a cast ICollection<T> c = (ICollection<T>)Get("pk"); // 2. The returned object can be any `IEnumerable<T>`, so you need to // enumerate it and put it into something implementing `ICollection<T>`. // The easiest is to use `ToList()`: ICollection<T> c = Get("pk").ToList();
Opsi kedua lebih fleksibel, tetapi memiliki dampak kinerja yang jauh lebih besar. Pilihan lainnya adalah menyimpan hasil sebagai
IEnumerable<T>
kecuali Anda memerlukan fungsionalitas tambahan yang ditambahkan olehICollection<T>
antarmuka.Komentar Kinerja Tambahan
Lingkaran yang Anda miliki
for (var index = 0; index < Items.Count(); index++)
bekerja pada suatu
IEnumerable<T>
tetapi tidak efisien; setiap panggilan keCount()
membutuhkan penghitungan lengkap semua elemen. Gunakan koleksi danCount
properti (tanpa tanda kurung) atau ubah menjadi foreach loop:foreach(var item in Items)
sumber
ICollection<T>
dapat dimanipulasi (lihat dokumen untuk detailnya), sedangkan anIEnumerable<T>
hanya dapat disebutkan.IEnumerable<T>
begituIEnumerable<T>
saja dalam kasus itu.Anda tidak dapat mengonversi langsung dari
IEnumerable<T>
keICollection<T>
. Anda dapat menggunakanToList
metodeIEnumerable<T>
untuk mengubahnya menjadiICollection<T>
someICollection = SomeIEnumerable.ToList();
sumber
Menunggu informasi lebih lanjut tentang pertanyaan:
berikan informasi lebih lanjut tentang jenis barang dan tanda tangan Get
Dua hal yang bisa Anda coba adalah:
Harap dicatat yang kedua akan menimbulkan kinerja hit untuk salinan array. Jika tanda tangan (tipe pengembalian) dari Get bukan ICollection maka yang pertama tidak akan berfungsi, jika bukan IEnumerable maka yang kedua tidak akan berfungsi.
Setelah klarifikasi Anda untuk pertanyaan dan komentar, saya pribadi akan menyatakan kembali jenis _item.Get ("001") ke ICollection. Ini berarti Anda tidak perlu melakukan casting atau konversi apa pun (melalui ToList / ToArray) yang akan melibatkan operasi buat / salin yang tidak perlu.
// Leave this the same public ICollection<Item> Items { get; set; } // Change function signature here: // As you mention Item uses the same underlying type, just return an ICollection<T> public ICollection<Item> Get(string value); // Ideally here you want to call .Count on the collectoin, not .Count() on // IEnumerable, as this will result in a new Enumerator being created // per loop iteration for (var index = 0; index < Items.Count(); index++)
Salam Hormat,
sumber