using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace collection_interface
{
public class listboxtest : IEnumerable<String>这里为什么没有加一个ienumerator接口呢,这没加下面为什么可以调用这个接口的方法呢? {
private string[] strings;
private int ctr = 0;
public IEnumerator<string> GetEnumerator()
{
foreach (string s in strings)
{
yield return s;
}
} IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public listboxtest(params string[] initialstrings)
{
strings = new String[8];
foreach (string s in initialstrings)
{
strings[ctr++] = s;
}
}
public void add(string thestring)
{
strings[ctr] = thestring;
ctr++;
}
public string this[int index]
{
get
{
if (index < 0 || index >= strings.Length)
{
}
return strings[index];
}
set
{
strings[index] = value; }
}
public int getnumentries()
{
return ctr;
}
} class Program
{
static void Main(string[] args)
{
listboxtest lbt = new listboxtest("hello", "world");
lbt.add("who");
lbt.add("is");
lbt.add("douglas");
lbt.add("adams");
string subst = "universe";
lbt[1] = subst;
foreach (string s in lbt)
{
Console.WriteLine("value:{0}", s);
}
}
}
}
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace collection_interface
{
public class listboxtest : IEnumerable<String>这里为什么没有加一个ienumerator接口呢,这没加下面为什么可以调用这个接口的方法呢? {
private string[] strings;
private int ctr = 0;
public IEnumerator<string> GetEnumerator()
{
foreach (string s in strings)
{
yield return s;
}
} IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public listboxtest(params string[] initialstrings)
{
strings = new String[8];
foreach (string s in initialstrings)
{
strings[ctr++] = s;
}
}
public void add(string thestring)
{
strings[ctr] = thestring;
ctr++;
}
public string this[int index]
{
get
{
if (index < 0 || index >= strings.Length)
{
}
return strings[index];
}
set
{
strings[index] = value; }
}
public int getnumentries()
{
return ctr;
}
} class Program
{
static void Main(string[] args)
{
listboxtest lbt = new listboxtest("hello", "world");
lbt.add("who");
lbt.add("is");
lbt.add("douglas");
lbt.add("adams");
string subst = "universe";
lbt[1] = subst;
foreach (string s in lbt)
{
Console.WriteLine("value:{0}", s);
}
}
}
}
IEnumerable 有 GetEnumerator方法。
通常来说我们都是继承两个接口来实现foreach
MyClass:IEnumerable,IEnumerator
{
public IEnumerator GetEnumerator()
{
return this;//因为本身就继承了IEnumerator
}
}
这里的foreach 使用yield return后也会产生一个IEnumerator的对象。
相当于这里new了一个IEnumerator接口的子类。
public IEnumerator<string> GetEnumerator()
{
foreach (string s in strings)
{
yield return s;
}
}只要能够在GetEnumerator方法中返回一个IEnumerator的对象,继不继承都一样。
GetEnumerator是在IEnumerable接口中定义的。public IEnumerator<string> GetEnumerator()
这里只是在实现IEnumerable接口,并非调用方法。只是这个方法需要返回一个IEnumerator类型的对象
IEnumerator才是迭代器集合。IEnumerable只是使这个迭代器适合foreach格式IEnumerator本来是个集合,可以循环迭代。只是不能使用foreach这中格式,只能使用for循环,而且不好看。
IEnumerable把他转换包装了一下,使他能够使用foreach循环,美好代码,便于理解。IEnumerator循环实例: string[] strs = new string[] { "A", "B", "C" };
IEnumerator ier = strs.GetEnumerator();
for (ier.Reset(); ier.MoveNext(); )
{
//ier.Current; //依次得到A\B\C
}