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.