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.