IEnumerable<object> a = new IEnumerable<object>(); Can I do this?
我想创建一个对象的新实例IEnumerable。
我能做这个吗?
1
| IEnumerable <object> a = new IEnumerable <object>(); |
- 相关:stackoverflow.com/questions/191013/&hellip;
- 不,甚至都没有意义。
- 请澄清你的问题。这行代码不会编译,我相信你已经发现了。如果你能给我们更多的信息来了解你真正想要达到的目标,那将有助于我们回答你。
- 我想创建一个新的可枚举对象或列表,并能够添加到其中。
- @温曼20-10:嗯,这改变了一切。不能添加到通用IEnumerable中。你必须使用像List这样的东西。
- 在这种情况下,您需要一个具体的数组列表
- @Ivo:注意,IEnumerable并不表示迭代器——它表示一个可迭代的序列。IEnumerator本身表示迭代器。
- 谢谢乔恩,我知道这一点-stackoverflow.com/questions/4514538/&hellip;:)但是不要把这个人搞混了。
- IEnumerable可以处理对象的不同数据类型,或者像IEnumerableneed answer一样处理
例如,您可以创建List的实例,该实例实现IEnumerable。例子:
1 2 3 4 5 6 7
| List <object> list = new List <object>();
list .Add(1);
list .Add(4);
list .Add(5);
IEnumerable <object> en = list ;
CallFunction (en ); |
- 考虑到问题显示了泛型的使用,举一个不实现泛型IEnumerable的类型的例子,IMO是一个坏主意。
- 你说得对,乔恩·斯基特。
- 使用callFunction(list.aseNumerable())而不是ieNumerableen=list;时出现任何问题…
- 如果可能的话,我会使用带文字初始值设定项的数组,它是.NET中最有效和最轻的可枚举类型,并且没有列表<>的开销。只有在初始化后确实需要或想要改变时,才应该使用列表。另外,最好在数组或列表中添加System.Linq和Invoke.AsEnumerable()。
既然您现在指定要添加它,那么您需要的不是一个简单的IEnumerable,而是至少一个ICollection。我建议您只使用这样的List:
1 2 3 4
| List <object> myList =new List <object>();
myList .Add(1);
myList .Add(2);
myList .Add(3); |
由于List实现IEnumerable,所以可以在预期的任何地方使用mylist。
(澄清前的旧答案)
您不能创建IEnumerable的实例,因为它是一个普通接口(有时可以指定默认实现,但通常只用于COM)。
所以您真正想要的是实例化一个实现接口IEnumerable的类。根据您选择的类,行为会有所不同。
对于空序列,请使用:
1
| IEnumerable<object> e0=Enumerable.Empty<object>(); |
。
对于非空的可枚举集合,可以使用实现IEnumerable的集合。常见的选择是数组T[]、List,或者如果您想要不可变的ReadOnlyCollection。
1 2 3
| 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的另一种常见方法是C 3中引入的迭代器特性:
1 2 3 4 5 6 7 8
| IEnumerable<object> MyIterator()
{
yield return 1;
yield return 2;
yield return 3;
}
IEnumerable<object> e4=MyIterator(); |
不,你不能,因为IEnumerable是一个接口。
您应该能够创建实现IEnumerable的大多数非接口类型的空实例,例如:-
1
| IEnumerable <object> a = new object[] { }; |
号
或
1
| IEnumerable <object> a = new List <object>(); |
- 接口是类型。
- @投票者:有什么特别的原因吗?
- @阿达姆拉普:我投了反对票,然后分心了,所以不能马上发表评论。接口是类型,所以您的答案是危险的错误,因为它传播了一种常见的误解。
- 好吧,够公平了-编辑过
- @阿达姆拉普:所以我也投了反对票。现在已经移除。
- @Adamralph:也被移除。
另一种解决方案是使用Empty。
1
| IEnumerable<object> a = Enumerable.Empty<object>(); |
。
关于它有一个线程:使用Enumerable.Empty()而不是新列表初始化IEnumerable更好吗?
不,你不能那样做。请改用以下代码行:
1
| IEnumerable <int> usersIds = new List <int>() {1, 2, 3}.AsEnumerable(); |
希望有帮助。
主要原因是我们无法创建接口的对象,而IEnumerable是接口。我们需要创建实现接口的类的对象。这是我们无法直接创建IEnumerable对象的主要原因。
I wanted to create a new enumerable object or list and be able to add to it.
号
这个评论改变了一切。不能添加到通用IEnumerable中。如果您想继续使用System.Collections.Generic中的接口,则需要使用一个实现ICollection的类,如List。
没有IEnumerable是接口,无法创建接口的实例
你可以这样做
1
| IEnumerable <object> a = new object[0]; |
。
- 除非它是一个COM接口…
- 是否可以像@jon skeet那样创建COM接口的实例?
- 当然。很奇怪,但是真的。请参阅stackoverflow.com/questions/1093536/&hellip;和msmvps.com/blogs/jonskeet/archive/2009/07/07/&hellip;
- 我认为可以指定一个实例化的默认实现,而不是COM接口的接口。
- 哦,我看到了@jon skeet,非常感谢!
- @jonsket是不是更准确地说,调用new SomeComInterface()会实例化接口的关联"coclass",而不是实例化接口本身?
- @Phoog:那是准确的——但重要而奇怪的是,在某些情况下,您可以使用带有接口的new。