IEnumerable <object> a =新的IEnumerable <object>(); 我可以这样做吗?


90

我想创建一个对象的新实例 IEnumerable<object>

我可以这样做吗?

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


1
不,这甚至没有意义。
CodesInChaos 2011年

3
@ WingMan20-10:嗯,这改变了一切。您不能将其添加到泛型中IEnumerable<T>。您必须使用List<T>
杰森

1
在这种情况下,您需要一个具体的数组List <object> objs = new IEnumerable <object>。您无法将项目添加到迭代器中,因为它不是集合...
而是

1
@ivo:请注意,IEnumerable<T>它不表示迭代器-它表示可迭代的序列。IEnumerator<T>本身代表迭代器。
乔恩·斯基特

Answers:


114

例如,您可以创建一个实例List<object>,它实现IEnumerable<object>。例:

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

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

11
鉴于该问题说明了泛型的使用,因此给出一个示例,该示例未实现泛型IEnumerable<T>是IMO的一个好主意。
乔恩·斯基特

使用CallFunction(list.AsEnumerable())而不是IEnumerable <object> en = list的任何问题; ...
Gina Marano 2014年

如果可能的话,我会使用带有文字初始化程序的数组,它是.NET中最高效,最轻量的可枚举类型,并且没有List <>的开销。仅当您确实需要或想要在初始化后进行变异时,才应使用列表。另外,最好添加System.Linq并在数组或列表上调用.AsEnumerable()。
马克

33

由于您现在已指定要添加到其中,因此所需的不是简单的,IEnumerable<T>而是至少一个ICollection<T>。我建议简单地使用List<T>如下所示:

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

您可以在IEnumerable<object>期望的任何地方使用myList ,因为List<object>实现IEnumerable<object>

(澄清之前的旧答案)

您无法创建的实例 IEnumerable<T>因为它是普通接口(有时可以指定默认实现,但这通常仅用于COM)。

因此,您真正想要的是实例化一个实现接口 IEnumerable<T>。行为因您选择的班级而异。

对于空序列,请使用:

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

对于非空枚举,可以使用一些实现的集合IEnumerable<T>。常见的选择是数组T[]List<T>或者是否需要不变性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});

另一种常见的实现方式IEnumerable<T>是C#3中引入的迭代器功能

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

IEnumerable<object> e4=MyIterator();


24

不,您不能因为IEnumerable界面而已。

您应该能够创建实现了的大多数非接口类型的空实例IEnumerable,例如:

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

要么

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

@AdamRalph:我投了反对票,然后分心了,所以不能立即发表评论。接口是类型,因此您的答案很危险,因为它会传播常见的误解,这是错误的。
杰森


1

我想创建一个新的可枚举的对象或列表并能够添加到它。

此评论改变了一切。您不能将其添加到泛型中IEnumerable<T>。如果您希望保留其中的接口System.Collections.Generic,则需要使用实现ICollection<T>类似的类List<T>


1

主要原因是我们无法创建接口的对象,而IEnumerable是interface。我们需要创建实现接口的类的对象。这是我们不能直接创建IEnumerable对象的主要原因。


0

没有IEnumerable是一个接口,您不能创建该接口的实例

你可以做这样的事情

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

是否可以创建像@Jon Skeet这样的COM接口实例?
Arsen Mkrtchyan


1
我认为可以指定实例化的默认实现,而不是COM接口的接口。
CodesInChaos 2011年

@JonSkeet说调用new SomeComInterface()实例化接口的关联“ CoClass”,而不是实例化接口本身,是否更准确?
phoog 2012年

@phoog:没错-但重要且奇怪的是,new在某些情况下您可以使用接口。
乔恩·斯基特

0

你可以这样做:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.