Bir nesnenin yeni bir örneğini oluşturmak istiyorum IEnumerable<object>
Bunu yapabilir miyim?
IEnumerable<object> a = new IEnumerable<object>();
Bir nesnenin yeni bir örneğini oluşturmak istiyorum IEnumerable<object>
Bunu yapabilir miyim?
IEnumerable<object> a = new IEnumerable<object>();
IEnumerable<T>. Gibi bir şey kullanmalısın List<T>.
IEnumerable<T>Bir yineleyiciyi temsil etmediğini unutmayın - yinelenebilir bir diziyi temsil eder . IEnumerator<T>kendisi yineleyiciyi temsil eder.
Yanıtlar:
Ö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);
IEnumerable<T>, kötü bir fikir IMO'dur.
Ş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();
Başka bir çözüm kullanmaktır Empty.
IEnumerable<object> a = Enumerable.Empty<object>();
SO'da bununla ilgili bir iş parçacığı var: Bir IEnumerable'ı başlatmak için yeni List yerine Enumerable.Empty () kullanmak daha mı iyi?
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>();
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.
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>.
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];
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?
newbelirli durumlarda bir arayüzle kullanabilmenizdir .
Bunu yapabilirsiniz:
IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);