IEnumerable <object> a = new IEnumerable <object> (); Bolehkah saya melakukan ini


95

Saya ingin membuat contoh baru dari sebuah objek IEnumerable<object>

Bolehkah saya melakukan ini

IEnumerable<object> a = new IEnumerable<object>();


1
Tidak, dan itu bahkan tidak masuk akal.
CodesInChaos

3
@ WingMan20-10: Nah, itu mengubah SEMUANYA. Anda tidak dapat menambahkan ke generik IEnumerable<T>. Anda harus menggunakan sesuatu seperti List<T>.
jason

1
Dalam hal ini Anda memerlukan Daftar larik konkret <object> objs = new IEnumerable <object>. Anda tidak dapat menambahkan item ke iterator karena itu bukan koleksi ... ini adalah iterator :)
pengguna44298

1
@ivo: Catatan itu IEnumerable<T>tidak mewakili sebuah iterator - itu mewakili urutan yang dapat diulang . IEnumerator<T>itu sendiri mewakili iterator.
Jon Skeet

Jawaban:


117

Misalnya, Anda dapat membuat instance dari List<object>, yang mengimplementasikan IEnumerable<object>. Contoh:

List<object> list = new List<object>();
list.Add(1);
list.Add(4);
list.Add(5);

IEnumerable<object> en = list;
CallFunction(en);

11
Mengingat bahwa pertanyaan menunjukkan penggunaan generik, diberi contoh jenis yang tidak mengimplementasikan generik IEnumerable<T>adalah ide yang buruk IMO.
Jon Skeet

Masalah apa pun dengan menggunakan CallFunction (list.AsEnumerable ()) daripada IEnumerable <object> en = list; ...
Gina Marano

Saya akan menggunakan array dengan penginisialisasi literal jika memungkinkan, ini adalah jenis enumerable yang paling efisien dan ringan yang tersedia di .NET dan tidak memiliki overhead dari List <>. Daftar sebaiknya hanya digunakan jika Anda benar-benar perlu atau ingin bermutasi setelah inisialisasi. Selain itu, lebih baik menambahkan System.Linq dan memanggil .AsEnumerable () pada array atau daftar.
Tandai

33

Karena Anda sekarang menentukan ingin menambahkannya, apa yang Anda inginkan bukanlah yang sederhana IEnumerable<T>tetapi setidaknya ICollection<T>. Saya merekomendasikan hanya menggunakan List<T>seperti ini:

List<object> myList=new List<object>();
myList.Add(1);
myList.Add(2);
myList.Add(3);

Anda dapat menggunakan myList di mana pun yang IEnumerable<object>diharapkan, sejak List<object>implementasi IEnumerable<object>.

(jawaban lama sebelum klarifikasi)

Anda tidak dapat membuat instance IEnumerable<T>karena ini adalah antarmuka normal (Terkadang mungkin untuk menentukan implementasi default, tetapi biasanya hanya digunakan dengan COM).

Jadi yang Anda inginkan adalah membuat instance kelas yang mengimplementasikan antarmuka IEnumerable<T> . Perilakunya bervariasi bergantung pada kelas yang Anda pilih.

Untuk penggunaan urutan kosong:

IEnumerable<object> e0=Enumerable.Empty<object>();

Untuk enumerable yang tidak kosong, Anda dapat menggunakan beberapa collection yang mengimplementasikan IEnumerable<T>. Pilihan umum adalah larik T[], List<T>atau jika Anda menginginkan kekekalan ReadOnlyCollection<T>.

IEnumerable<object> e1=new object[]{1,2,3};
IEnumerable<object> e2=new List<object>(){1,2,3};
IEnumerable<object> e3=new ReadOnlyCollection(new object[]{1,2,3});

Cara umum lainnya untuk mengimplementasikan IEnumerable<T>adalah fitur iterator yang diperkenalkan di C # 3:

IEnumerable<object> MyIterator()
{
  yield return 1;
  yield return 2;
  yield return 3;
}

IEnumerable<object> e4=MyIterator();


24

Tidak, Anda tidak bisa sejak itu IEnumerableadalah antarmuka.

Anda harus dapat membuat instance kosong dari sebagian besar jenis non-antarmuka yang diimplementasikan IEnumerable, misalnya: -

IEnumerable<object> a = new object[] { };

atau

IEnumerable<object> a = new List<object>();

@AdamRalph: Saya downvoted, dan kemudian terganggu, jadi tidak bisa memberikan komentar segera. Antarmuka adalah tipe, jadi jawaban Anda sangat salah karena menyebarkan kesalahpahaman yang umum.
jason

7

Tidak, Anda tidak bisa melakukan itu. Gunakan baris kode berikut sebagai gantinya:

IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();

Saya harap ini membantu.


1

Saya ingin membuat objek atau daftar baru yang dapat dihitung dan dapat menambahkannya.

Komentar ini mengubah segalanya. Anda tidak dapat menambahkan ke generik IEnumerable<T>. Jika Anda ingin tetap menggunakan antarmuka di System.Collections.Generic, Anda perlu menggunakan kelas yang mengimplementasikan ICollection<T>seperti List<T>.


1

Alasan utamanya adalah kita tidak dapat membuat objek dari sebuah antarmuka, dan IEnumerable adalah sebuah antarmuka . Kita perlu membuat objek kelas yang mengimplementasikan antarmuka. Inilah alasan utama kami tidak dapat langsung membuat objek IEnumerable.


0

Tidak ada IEnumerable adalah antarmuka, Anda tidak dapat membuat contoh antarmuka

Anda bisa melakukan sesuatu seperti ini

IEnumerable<object> a = new object[0];

Apakah mungkin untuk membuat contoh antarmuka COM seperti itu @Jon Skeet?
Arsen Mkrtchyan


1
Saya pikir itu mungkin untuk menentukan implementasi default yang dipakai alih-alih antarmuka untuk antarmuka COM.
CodesInChaos

@ JonSkeet Bukankah lebih akurat untuk mengatakan bahwa pemanggilan new SomeComInterface()membuat instance "CoClass" yang terkait dengan antarmuka daripada membuat instance antarmuka itu sendiri?
phoog

@phoog: Itu akan akurat - tetapi yang penting dan aneh adalah Anda dapat menggunakan newantarmuka dalam situasi tertentu.
Jon Skeet

0

Kamu bisa melakukan ini:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.