IEnumerable <nesne> a = new IEnumerable <nesne> (); Bunu yapabilir miyim?


95

Bir nesnenin yeni bir örneğini oluşturmak istiyorum IEnumerable<object>

Bunu yapabilir miyim?

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


1
Hayır ve mantıklı bile değil.
— CodesInChaos

3
@ WingMan20-10: Bu HER ŞEYİ değiştiriyor. Bir jenere ekleyemezsiniz IEnumerable<T>. Gibi bir şey kullanmalısın List<T>.
— jason

1
Bu durumda somut bir dizi List <nesne> objs = new IEnumerable <object> gerekir. Bir koleksiyon olmadığı için bir yineleyiciye öğe ekleyemezsiniz ... bu bir yineleyici :)
— user44298

1
@ivo: IEnumerable<T>Bir yineleyiciyi temsil etmediğini unutmayın - yinelenebilir bir diziyi temsil eder . IEnumerator<T>kendisi yineleyiciyi temsil eder.
— Jon Skeet

Yanıtlar:


117

Örneğin List<object>, uygulayan bir örneğini oluşturabilirsiniz IEnumerable<object>. Misal:

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

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

11
Sorunun jeneriklerin kullanımını gösterdiği göz önüne alındığında, jeneriği uygulamayan bir tür örneği verildiğinde IEnumerable<T>, kötü bir fikir IMO'dur.
— Jon Skeet

IEnumerable <object> yerine CallFunction (list.AsEnumerable ()) kullanımıyla ilgili herhangi bir sorun en = list; ...
— Gina Marano

Mümkünse değişmez başlatıcılı bir dizi kullanırdım, .NET'te bulunan en verimli ve hafif numaralandırılabilir türdür ve bir List <> ek yüküne sahip değildir. Listeler yalnızca başlatmadan sonra gerçekten ihtiyacınız varsa veya değiştirmek istiyorsanız kullanılmalıdır. Ayrıca, diziye veya listeye System.Linq eklemek ve .AsEnumerable () öğesini çağırmak daha iyidir.
— Mark

33

Şimdi ona eklemek istediğinizi belirttiğinize göre, istediğiniz şey basit IEnumerable<T>değil en azından bir ICollection<T>. Basitçe List<T>şunun gibi kullanmanızı tavsiye ederim :

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

MyList'i IEnumerable<object>beklendiği her yerde kullanabilirsiniz , çünkü List<object>uygular IEnumerable<object>.

(açıklamadan önceki eski cevap)

IEnumerable<T>Normal bir arabirim olduğu için bir örnek oluşturamazsınız (Bazen varsayılan bir uygulama belirtmek mümkündür, ancak bu genellikle yalnızca COM ile kullanılır).

Yani gerçekten istediğiniz, arayüzü uygulayan bir sınıfın somutlaştırılmasıdır . Davranış, seçtiğiniz sınıfa göre değişir. IEnumerable<T>

Boş bir sıra için şunu kullanın:

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

Boş olmayan bir numaralandırılabilir için, uygulayan bazı koleksiyonlar kullanabilirsiniz IEnumerable<T>. Yaygın seçimler dizisi olan T[], List<T>sen değişmezlik istiyorsanız veya 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});

Uygulamak için başka bir yaygın yolu IEnumerable<T>olan yineleyici özelliği C # 3 tanıtıldı:

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

IEnumerable<object> e4=MyIterator();


24

Hayır, o zamandan beri yapamazsınız IEnumerablebir arayüz.

Örneğin aşağıdakileri uygulayan arabirim dışı türlerin çoğunun boş bir örneğini oluşturabilmelisiniz IEnumerable: -

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

veya

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

@AdamRalph: Eksik oy verdim ve sonra dikkatim dağıldı, bu yüzden hemen yorum bırakamadım. Arayüzler türlerdir, bu nedenle cevabınız tehlikeli derecede yanlıştır çünkü yaygın bir yanlış kanı yaymaktadır.
— jason

7

Hayır, bunu yapamazsınız. Bunun yerine aşağıdaki kod satırını kullanın:

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

Umut ediyorum bu yardım eder.


1

Yeni bir numaralandırılabilir nesne veya liste oluşturmak ve buna ekleme yapabilmek istedim.

Bu yorum her şeyi değiştirir. Bir jenere ekleyemezsiniz IEnumerable<T>. Arabirimler içinde kalmak istiyorsanız System.Collections.Generic, ICollection<T>gibi uygulayan bir sınıf kullanmanız gerekir List<T>.


1

Ana neden, bir arabirimin nesnesini oluşturamıyoruz ve IEnumerable bir arabirimdir . Arayüzü uygulayan sınıfın nesnesini oluşturmamız gerekiyor. IEnumerable nesnesini doğrudan oluşturamamamızın ana nedeni budur.


0

Hiçbir IEnumerable bir arayüz değildir, arayüz örneği oluşturamazsınız

bunun gibi bir şey yapabilirsin

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

@ Jon Skeet gibi bir COM arayüzü örneği oluşturmak mümkün mü?
— Arsen Mkrtchyan


1
COM arayüzleri için arayüz yerine örneklenen bir varsayılan uygulama belirtmenin mümkün olduğunu düşünüyorum.
— CodesInChaos

@JonSkeet, çağırmanın new SomeComInterface()arayüzün kendisini somutlaştırmaktansa arayüzün ilişkili "CoClass" ı başlattığını söylemek daha doğru değil mi?
— phoog

@phoog: Bu doğru olur - ancak önemli ve garip olan şey, newbelirli durumlarda bir arayüzle kullanabilmenizdir .
— Jon Skeet

0

Bunu yapabilirsiniz:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.