任何人都可以向我解释一下IEnumerable&的区别是什么? IEnumerator, 以及如何使用它们?
感谢!!!
答案 0 :(得分:11)
通常,IEnumerable
是可以枚举的对象,例如列表或数组。 IEnumerator
是一个存储枚举状态的对象。
它们不是同一个的原因是你可以同时在同一个对象上有多个枚举 - 即使在单线程应用程序中也是如此。例如,请考虑以下代码:
foreach (x in mylist)
{
foreach (y in mylist)
{
if (x.Value == y.Value && x != y)
{
// Found a duplicate value
}
}
}
如果mylist
是IEnumerable
的正确实现,这将正常工作,但如果mylist
将自己作为枚举器返回,则会失败。
答案 1 :(得分:10)
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
来执行元素的枚举。
答案 2 :(得分:3)
IEnumerable
是可以枚举的东西。 IEnumerator
是进行枚举的方法。因此,IEnumerable
只定义了一个方法 - GetEnumerator
,它返回IEnumerator
的实例以执行实际的工作......
答案 3 :(得分:2)
IEnumerable
定义一个对象,该对象包含可以枚举的对象聚合。
IEnumerator
是允许枚举聚合的对象,并存储枚举的状态。
答案 4 :(得分:0)
IEnumerable意味着可以枚举的东西,IEnumerator是枚举它的东西。
将其简化为简单的for循环:
for (int i=0; i<10;i++)
{
count+=myarray[i];
}
在上面的例子中,我将是IEnumerator,而myarray将是IEnumerable。
答案 5 :(得分:0)
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() + "----");
}