今天是第一天,希望有一天回过头来看到当初的自己能有所触动。--2018-11-27
1.IEnumerable实现了这个接口便可以迭代。Linq中的扩展方法中,自己用到的方法都实现了这个接口。IEnumerable中只有一个方法:IEnumerator GetEnumerator();方法返回的接口又实现了IDisposable和IEnumetator以及自己有个属性T Current{get;},这个属性表示集合中位于枚举数当前位置的元素。实现的接口分别含有释放托管资源的任务方法Dispose(),当然这个接口不是关注重点,后面才是。IEnumerator,此接口有一个属性object Current{get;},两个方法bool MoveNext()表示移到下一位,void Reset()表示重置(在第一个元素之前);属性都没有加修饰符,默认为private,并且都有Current属性。自己写了个类似的,说是如果隐藏就用new(先留意一下,日后再看书解决吧)。由于属性是只读的,这也就是为什么foreach遍历的时候不能够修改。大概流程就是通过方法获取对象,通过MoveNext移动下一位,顺便判断是否存在下一位,然后取值。实现如下:
class Program
{
static void Main(string[] args)
{
string[] str = new string[] { "1", "2", "3", "4", "5" };
//获取数组
MyIEnumerable a = new MyIEnumerable(str);
//获取遍历方法的对象
Btor b= a.GetEnumerator();
//执行遍历方法
while (b.MoveNext())
{
Console.WriteLine(b.Current);
}
Console.ReadKey();
}
}
public interface Able
{
Btor GetEnumerator();
}
public interface Btor
{
object Current { get; }
bool MoveNext();
void Reset();
}
public class MyIEnumerator : Btor
{
private string[] strList;
private int position;
public MyIEnumerator(string[] _strList)
{
strList = _strList;
position = -1;
}
public object Current
{
get { return strList[position]; }
}
public bool MoveNext()
{
position++;
if (position<strList.Length)
{
return true;
}
return false;
}
public void Reset()
{
position = -1;
}
}
//实现接口,通过方法获得实例
public class MyIEnumerable : Able
{
private string[] strList;
public MyIEnumerable(string []_strList)
{
strList = _strList;
}
public Btor GetEnumerator()
{
return new MyIEnumerator(strList);
}
}