请问有人能够解释一下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];
}
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() + "----");
}