Csharp/C Sharp/Class Interface/IEnumerable

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Enumerator Example (Versioned Collection)

<source lang="csharp"> using System; using System.Collections; public class Starter {

   public static void Main() {
       MyCollection simple = new MyCollection(new object[] { 1, 2, 3, 4, 5, 6, 7 });
       IEnumerator enumerator = simple.GetEnumerator();
       enumerator.MoveNext();
       Console.WriteLine(enumerator.Current);
       enumerator.MoveNext();
       simple[4] = 10;
       Console.WriteLine(enumerator.Current);
       enumerator.MoveNext();
   }

} public class MyCollection : IEnumerable {

   public MyCollection(object[] array) {
       items = array;
       version = 1;
   }
   public object this[int index] {
       get {
           return items[index];
       }
       set {
           ++version;
           items[index] = value;
       }
   }
   public IEnumerator GetEnumerator() {
       return new Enumerator(this);
   }
   private class Enumerator : IEnumerator {
       public Enumerator(MyCollection obj) {
           oThis = obj;
           cursor = -1;
           version = oThis.version;
       }
       public bool MoveNext() {
           ++cursor;
           if (cursor > (oThis.items.Length - 1)) {
               return false;
           }
           return true;
       }
       public void Reset() {
           cursor = -1;
       }
       public object Current {
           get {
               if (oThis.version != version) {
                   throw new InvalidOperationException("Collection was modified");
               }
               if (cursor > (oThis.items.Length - 1)) {
                   throw new InvalidOperationException("Enumeration already finished");
               }
               if (cursor == -1) {
                   throw new InvalidOperationException("Enumeration not started");
               }
               return oThis.items[cursor];
           }
       }
       private int version;
       private int cursor;
       private MyCollection oThis;
   }
   private object[] items = null;
   private int version;

}

</source>


Extends IEnumerable

<source lang="csharp"> using System; using System.Collections.Generic; using System.Text; using System.Collections; public class Employee {

   public int currAge;
   public string fName, lName;
   public Employee() { }
   public Employee(string firstName, string lastName, int age) {
       currAge = age;
       fName = firstName;
       lName = lastName;
   }
   public override string ToString() {
       return string.Format("{0}, {1} is {2} years old",
           lName, fName, currAge);
   }

} public class PeopleCollection : IEnumerable {

   private ArrayList arPeople = new ArrayList();
   public PeopleCollection() { }
   public Employee GetEmployee(int pos) { return (Employee)arPeople[pos]; }
   public void AddEmployee(Employee p) { arPeople.Add(p); }
   public void ClearPeople() { arPeople.Clear(); }
   public int Count { get { return arPeople.Count; } }
   IEnumerator IEnumerable.GetEnumerator() { return arPeople.GetEnumerator(); }

} class Program {

   static void Main(string[] args) {
       PeopleCollection myPeople = new PeopleCollection();
       myPeople.AddEmployee(new Employee("Homer", "Simpson", 40));
       myPeople.AddEmployee(new Employee("Marge", "Simpson", 38));
       myPeople.AddEmployee(new Employee("Lisa", "Simpson", 9));
       myPeople.AddEmployee(new Employee("Bart", "Simpson", 7));
       myPeople.AddEmployee(new Employee("Maggie", "Simpson", 2));
       foreach (Employee p in myPeople)
           Console.WriteLine(p);
   }

}

</source>


IEnumerable with a foreach loop

<source lang="csharp"> using System; using System.Collections.Generic; using System.Linq; public class MainClass {

   public static void Main() {
       IEnumerable<char> query = "Not what you might expect";
       foreach (char vowel in "aeiou")
           query = query.Where(c => c != vowel);
       foreach (char c in query) Console.Write(c); 
   }

}

</source>


iterates a collection forward and reverse

<source lang="csharp"> using System; using System.Collections.Generic; public class Starter {

   public static void Main() {
       Console.WriteLine("Forward List");
       MyClass obj = new MyClass();
       foreach (int item in obj) {
           Console.Write(item);
       }
       Console.WriteLine("\nReverse List");
       foreach (int item in obj.Reverse) {
           Console.Write(item);
       }
   }

} public class MyClass {

   private int[] list1 = new int[] { 0, 2, 4, 6, 8 };
   public IEnumerator<int> GetEnumerator() {
       for (int index = 0; index < 5; ++index) {
           yield return list1[index];
       }
   }
   public IEnumerable<int> Reverse {
       get {
           for (int index = 4; index >= 0; --index) {
               yield return list1[index];
           }
       }
   }

}

</source>


return IEnumerable

<source lang="csharp">

using System; using System.Collections.Generic; class IteratorDemo {

   static IEnumerable<int> OneTwoThree() {
       Console.WriteLine("Returning 1");
       yield return 1;
       Console.WriteLine("Returning 2");
       yield return 2;
       Console.WriteLine("Returning 3");
       yield return 3;
   }
   static void Main() {
       foreach (var number in OneTwoThree()) {
           Console.WriteLine(number);
       }
   }

}

</source>


Return IEnumerable by yield

<source lang="csharp"> using System; using System.Collections; public class Starter {

   public static void Main() {
       foreach (string day in ToEndOfMonth()) {
           Console.WriteLine(day);
       }
   }
   public static IEnumerable ToEndOfMonth() {
       DateTime date = DateTime.Now;
       int currMonth = date.Month;
       while (currMonth == date.Month) {
           string temp = currMonth.ToString() + "/" + date.Day.ToString();
           date = date.AddDays(1);
           yield return temp;
       }
   }

}

</source>


Tree Enumerator

<source lang="csharp"> using System; using System.Collections.Generic; using System.Linq; using System.Text; public class Tree<TItem> : IEnumerable<TItem> where TItem : IComparable<TItem> {

   public Tree(TItem nodeValue) {
       this.NodeData = nodeValue;
       this.LeftTree = null;
       this.RightTree = null;
   }
   public void Insert(TItem newItem) {
       TItem currentNodeValue = this.NodeData;
       if (currentNodeValue.rupareTo(newItem) > 0) {
           if (this.LeftTree == null) {
               this.LeftTree = new Tree<TItem>(newItem);
           } else {
               this.LeftTree.Insert(newItem);
           }
       } else {
           if (this.RightTree == null) {
               this.RightTree = new Tree<TItem>(newItem);
           } else {
               this.RightTree.Insert(newItem);
           }
       }
   }
   public void WalkTree() {
       if (this.LeftTree != null) {
           this.LeftTree.WalkTree();
       }
       Console.WriteLine(this.NodeData.ToString());
       if (this.RightTree != null) {
           this.RightTree.WalkTree();
       }
   }
   public TItem NodeData { get; set; }
   public Tree<TItem> LeftTree { get; set; }
   public Tree<TItem> RightTree { get; set; }
   IEnumerator<TItem> IEnumerable<TItem>.GetEnumerator() {
       return new TreeEnumerator<TItem>(this);
   }
   System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
       throw new NotImplementedException();
   }

} class TreeEnumerator<T> : IEnumerator<T> where T : IComparable<T> {

   public TreeEnumerator(Tree<T> data) {
       this.currentData = data;
   }
   private void populate(Queue<T> enumQueue, Tree<T> tree) {
       if (tree.LeftTree != null) {
           populate(enumQueue, tree.LeftTree);
       }
       enumQueue.Enqueue(tree.NodeData);
       if (tree.RightTree != null) {
           populate(enumQueue, tree.RightTree);
       }
   }
   private Tree<T> currentData = null;
   private T currentItem = default(T);
   private Queue<T> enumData = null;
   T IEnumerator<T>.Current {
       get {
           if (this.enumData == null)
               throw new InvalidOperationException("Use MoveNext before calling Current");
           return this.currentItem;
       }
   }
   void IDisposable.Dispose() {
       // throw new NotImplementedException();
   }
   object System.Collections.IEnumerator.Current {
       get { throw new NotImplementedException(); }
   }
   bool System.Collections.IEnumerator.MoveNext() {
       if (this.enumData == null) {
           this.enumData = new Queue<T>();
           populate(this.enumData, this.currentData);
       }
       if (this.enumData.Count > 0) {
           this.currentItem = this.enumData.Dequeue();
           return true;
       }
       return false;
   }
   void System.Collections.IEnumerator.Reset() {
       throw new NotImplementedException();
   }

} class Program {

   static void Main(string[] args) {
       Tree<int> tree1 = new Tree<int>(10);
       tree1.Insert(5);
       tree1.Insert(11);
       tree1.Insert(5);
       tree1.Insert(-12);
       tree1.Insert(15);
       tree1.Insert(0);
       tree1.Insert(14);
       tree1.Insert(-8);
       tree1.Insert(10);
       foreach (int item in tree1)
           Console.WriteLine(item);
   }

}

</source>


yield return

<source lang="csharp"> using System; using System.Collections; using System.Collections.Generic; using System.Text; class Program {

   public static IEnumerable<string> SimpleList() {
       yield return "1";
       yield return "2";
       yield return "3";
   }
   public static void Main(string[] args) {
       foreach (String item in SimpleList())
           Console.WriteLine(item);
   }

}

</source>