在平常的代码编写中,虽然不常用到Ienumerable 但却不可不知他的意义,有些时候使用会起到意想不到的作用,
我们从中可以知道 foreach 在IL中,是以Ienumberable 来体现的。
IEnumerable和IEnumerable
主要实现 public IEnumerator GetEnumerator()
C# 1.0中的foreach
没有迭代器的时候,创建一个可用于foreach的集合(C# 1.0):
public class MyCollection : IEnumerable
{
public MyEnumerator GetEnumerator()
{
return new MyEnumerator(this);
}
public class MyEnumerator : IEnumerator
{
public void Reset(){...}
public bool MoveNext(){...}
public int Current{ get{...} }
object IEnumerator.Current{ get{...} }
}
}
对集合使用foreach语句:
foreach(int i in col){...}
相单于:
IEnumerator etor = ((IEnumerable)col).GetEnumerator();
try
{
while(etor.MoveNext())
{
ElementType clem (ElementType)etor.Current;
...;
}
}
finally{(IDisposable)enumerator).Dispose();}
C# 2.0 中的迭代器
使用迭代器创建于foreach的集合(C# 2.0):
public class Stack:IEnumerable
{
T[] items;
int count;
public void Push(T data){...}
public T Pop(){...}
public IEnumerator GetEnumerator()
{
for(int i=count-1;i>=0;--i)
{
yield return items[i];
}
}
}
使用foreach语句:
Stack stack = new Stack();
foreach(int i in statck){...}
//将数据源中的数据都转换为IEnumerable类型,用作数据绑定
//其中_dataSource为数据源,DataMember为要找的数据名称
protected virtual IEnumerable GetDataSource()
{
if(_dataSource == null)
{
return null;
}
IEnumerable resolvedDataSource = _dataSource as IEnumerable;
if(resolvedDataSource != null)
{
return resolvedDataSource;
}
IListSource listSource = _dataSource as IListSource;
if(listSource != null)
{
IList memberList = listSource.GetList();
int i = memberList.Count;
if(listSource.ContainsListCollection == false)
{
return (IEnumerable)memberList;
}
ITypedList typedMemberList = memberList as ITypedList;
if(typedMemberList != null)
{
PropertyDescriptorCollection propDescs = typedMemberList.GetItemProperties(new PropertyDescriptor[0]);
PropertyDescriptor memberProperty = null;
if((propDescs != null) && (propDescs.Count!=0))
{
string dataMember = DataMember;
if(dataMember.Length == 0)
{
memberProperty = propDescs[0];
}
else
{
memberProperty = propDescs.Find(dataMember,true);
}
if(memberProperty != null)
{
object listRow = memberList[0];
object list = memberProperty.GetValue(listRow);
if(list is IEnumerable)
{
return (IEnumerable)list;
}
}
throw new Exception("no Datamember.");
}
throw new Exception("no datamember.");
}
}
return null;
}
http://www.cnblogs.com/hsapphire/archive/2010/04/16/1713211.html