只有繼承 IEnumerable IEnumerator 的類才能使用foreach。
點進去看可以看到IEnumerable的接口定義的是
public interface IEnumerable<out T> : IEnumerable
繼承了IEnumerable
IEnumerable只有一個方法,返回可循環訪問集合的枚舉數
IEnumerator GetEnumerator() ;
demo
IStack.cs
internal interface IStack<T> : IEnumerable<T>, IEnumerator<T>
{
void Push(T value);
void Pop();
T Peek();
void Empty();
bool IfEmpty();
int Count();
}
MyStack.cs 前一半是定義的棧結構
internal class MyStack<T> : IStack<T>
{
private List<T> datas;
public int index;
public int eumerableIndex;
public MyStack()
{
datas = new List<T>();
index = -1;
eumerableIndex = -1;
}
public int Count()
{
return index + 1;
}
public void Empty()
{
datas.Clear();
index = -1;
}
public bool IfEmpty()
{
return (datas.Count == 0);
}
public T Peek()
{
T top;
if (index > 0)
{
top = datas[datas.Count - 1];
}
else
{
top = default(T);
Console.WriteLine("Empty stack, Peek failed");
}
return top;
}
public void Push(T value)
{
datas.Add(value);
index++;
}
public void Pop()
{
if (index >= 0)
{
datas.RemoveAt(index);
index--;
Console.WriteLine("Pop");
}
else
{
Console.WriteLine("Empty Stack, Pop failed");
}
}
public override String ToString()
{
StringBuilder resultBuilder = new StringBuilder();
if (index < 0)
{
resultBuilder.Append("Empty");
}
else
{
for (int i = 0; i < index + 1; i++)
{
resultBuilder.Append(" ");
resultBuilder.Append(datas[i].ToString());
}
}
return resultBuilder.ToString();
}
public T Current
{
get
{
return datas[eumerableIndex];
}
}
public bool MoveNext()
{
return ++eumerableIndex < datas.Count;
}
object IEnumerator.Current
{
get
{
return Current;
}
}
public void Dispose()
{
eumerableIndex = -1;
}
public IEnumerator<T> GetEnumerator()
{
return this;
}
public void Reset()
{
eumerableIndex = -1;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
接下來聲明的MyStack就可以使用foreach方法了
MyStack<int> myStack = new MyStack<int>();
myStack.Push(1);
myStack.Push(2);
foreach (var val in myStack)
{
Console.WriteLine(val);
}