【发布时间】:2010-04-14 08:11:11
【问题描述】:
谁能给我解释一下 IEnumerable 和 IEnumerator 有什么区别, 以及如何使用它们?
谢谢!!!
【问题讨论】:
-
在什么语言/平台上?
-
那将是 .NET - 已重新标记。
谁能给我解释一下 IEnumerable 和 IEnumerator 有什么区别, 以及如何使用它们?
谢谢!!!
【问题讨论】:
通常,IEnumerable 是一个可以枚举的对象,例如列表或数组。 IEnumerator 是一个存储枚举状态的对象。
它们不同的原因是您可以同时对同一个对象进行多个枚举 - 即使在单线程应用程序中也是如此。例如,考虑以下代码:
foreach (x in mylist)
{
foreach (y in mylist)
{
if (x.Value == y.Value && x != y)
{
// Found a duplicate value
}
}
}
如果mylist 是IEnumerable 的正确实现,这将正常工作,但如果mylist 将自身作为枚举器返回,则它将失败。
【讨论】:
IEnumerable 接口定义了一个可以枚举的类,即它包含可以通过枚举访问的元素。
IEnumerator 接口定义了一个可以对一系列元素执行枚举的类。
区别在于IEnumerable的意思是“你可以枚举我”,其中IEnumerator执行枚举的任务。
更详细地说,IEnumerable 公开了一个方法GetEnumerator。此方法返回一个IEnumerator,然后您可以使用它来执行枚举。通常你不会自己处理这个方法,因为foreach 关键字会为你处理它。
foreach(int element in myList)
{
// Do some work...
}
编译器实际上已将这段代码扩展为:
IEnumerator enumerator = myList.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
int element = (int)enumerator.Current;
// Do some work...
}
}
finally
{
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
如您所见,这里使用IEnumerator 来执行对元素的枚举。
【讨论】:
IEnumerable 是可以枚举的东西。 IEnumerator 是进行该枚举的方法。所以IEnumerable 只定义了一个方法——GetEnumerator,它返回一个IEnumerator 的实例来做实际的工作......
【讨论】:
IEnumerable 定义了一个对象,其中包含对象的聚合,可以枚举。
IEnumerator是允许枚举聚合的对象,并存储枚举的状态。
【讨论】:
IEnumerable 表示可以枚举的东西,IEnumerator 是枚举它的东西。
将其简化为一个简单的 for 循环:
for (int i=0; i<10;i++)
{
count+=myarray[i];
}
在上面的例子中,i 是 IEnumerator,myarray 是 IEnumerable。
【讨论】:
int,它没有实现IEnumerator。
IEnumerable 和 IEnumerator 之间的区别。
获取代码-IEnumerable & IEnumerator
public class Program {
public static void Main(string[] args) {
IEnumerable_Example();
}
static void IEnumerable_Example() {
List < string > Month = new List < string > ();
Month.Add("January");
Month.Add("February");
Month.Add("March");
Month.Add("April");
Month.Add("May");
Month.Add("June");
Month.Add("July");
Month.Add("August");
Month.Add("September");
Month.Add("October");
Month.Add("November");
Month.Add("December");
IEnumerable < string > IEnumerable_ = (IEnumerable < string > ) Month;
Console.WriteLine("IEnumerable_Example() Executing");
Console.WriteLine("------------IEnumerable Returning items using foreach----------------");
foreach(string i in IEnumerable_) {
Console.WriteLine(i);
}
IEnumerator_Example(IEnumerable_);
}
static public void IEnumerator_Example(IEnumerable enumerable) {
IEnumerator enumerator = enumerable.GetEnumerator();
Console.WriteLine("----------IEnumerator_Example() Executing------------");
while (enumerator.MoveNext()) {
Console.WriteLine("----" + enumerator.Current.ToString() + "----");
}
【讨论】: