Csharp/CSharp Tutorial/Data Structure/IEnumerable
Версия от 15:31, 26 мая 2010; (обсуждение)
Содержание
Counting Enumerable
using System;
using System.Collections;
using System.Collections.Generic;
using System.ruponentModel;
class CountingEnumerable : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
return new CountingEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
class CountingEnumerator : IEnumerator<int>
{
int current = -1;
public bool MoveNext()
{
current++;
return current < 10;
}
public int Current
{
get { return current; }
}
object IEnumerator.Current
{
get { return Current; }
}
public void Reset()
{
throw new NotSupportedException();
}
public void Dispose()
{
}
}
class MainClass
{
static void Main()
{
CountingEnumerable counter = new CountingEnumerable();
foreach (int x in counter)
{
Console.WriteLine(x);
}
}
}Get list of integer whose value is higher than 10
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using System.Xml.Linq;
class Program
{
static void Main(string[] args)
{
int[] integers = { 1, 6, 2, 27};
IEnumerable<int> twoDigits = from numbers in integers where numbers >= 10 select numbers;
Console.WriteLine("Integers > 10:");
foreach (var number in twoDigits)
{
Console.WriteLine(number);
}
}
}Implement IEnumerable with loop
using System;
using System.Collections.Generic;
using System.Text;
class MyClass : IEnumerable<string>
{
IEnumerator<string> Letter
{
get
{
string[] s = { "A", "B", "C" };
for (int i = 0; i < s.Length; i++)
yield return s[i];
}
}
public IEnumerator<string> GetEnumerator()
{
return Letter;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return Letter;
}
}
class MainClass
{
static void Main()
{
MyClass mc1 = new MyClass();
foreach (string s in mc1)
Console.Write("{0} ", s);
}
}A B C
Implement IEnumerable with "yield"
using System;
using System.Collections.Generic;
using System.Text;
class MyClass : IEnumerable<string>
{
IEnumerator<string> Letter
{
get
{
yield return "A";
yield return "B";
yield return "C";
}
}
public IEnumerator<string> GetEnumerator()
{
return Letter;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return Letter;
}
}
class MainClass
{
static void Main()
{
MyClass mc1 = new MyClass();
foreach (string s in mc1)
Console.Write("{0} ", s);
}
}A B C
Iterator Block Iteration Sample
using System;
using System.Collections;
using System.ruponentModel;
class IteratorBlockIterationSample : IEnumerable
{
object[] values;
int startingPoint;
public IteratorBlockIterationSample(object[] values, int startingPoint)
{
this.values = values;
this.startingPoint = startingPoint;
}
public IEnumerator GetEnumerator()
{
for (int index = 0; index < values.Length; index++)
{
yield return values[(index + startingPoint) % values.Length];
}
}
static void Main()
{
object[] values = { "a", "b", "c", "d", "e" };
IteratorBlockIterationSample collection = new IteratorBlockIterationSample(values, 3);
foreach (object x in collection)
{
Console.WriteLine(x);
}
}
}Provide different IEnumerable implemetation for one class
using System;
using System.Collections.Generic;
public class Employee
{
public string Name;
public string Title;
public Employee(string name, string title)
{
Name = name;
Title = title;
}
public override string ToString()
{
return string.Format("{0} ({1})", Name, Title);
}
}
public class EmployeeList
{
private List<Employee> employeeList = new List<Employee>();
public IEnumerator<Employee> GetEnumerator()
{
foreach (Employee tm in employeeList)
{
yield return tm;
}
}
public IEnumerable<Employee> Reverse
{
get
{
for (int c = employeeList.Count - 1; c >= 0; c--)
{
yield return employeeList[c];
}
}
}
public IEnumerable<Employee> FirstTwo
{
get
{
int count = 0;
foreach (Employee tm in employeeList)
{
if (count >= 2)
{
yield break;
}
else
{
count++;
yield return tm;
}
}
}
}
public void AddEmployee(Employee member)
{
employeeList.Add(member);
}
}
public class MainClass
{
public static void Main()
{
EmployeeList employeeList = new EmployeeList();
employeeList.AddEmployee(new Employee("A", "AA"));
employeeList.AddEmployee(new Employee("B", "BB"));
employeeList.AddEmployee(new Employee("C", "CC"));
Console.WriteLine("Enumerate using default iterator:");
foreach (Employee member in employeeList)
{
Console.WriteLine(" " + member.ToString());
}
Console.WriteLine("Enumerate using the FirstTwo iterator:");
foreach (Employee member in employeeList.FirstTwo)
{
Console.WriteLine(" " + member.ToString());
}
Console.WriteLine("Enumerate using the Reverse iterator:");
foreach (Employee member in employeeList.Reverse)
{
Console.WriteLine(" " + member.ToString());
}
}
}Enumerate using default iterator: A (AA) B (BB) C (CC) Enumerate using the FirstTwo iterator: A (AA) B (BB) Enumerate using the Reverse iterator: C (CC) B (BB) A (AA)
yield value for IEnumerable
using System;
using System.Collections.Generic;
public class MainClass
{
static public IEnumerable<int> Powers( int from,
int to ) {
for( int i = from; i <= to; ++i ) {
yield return (int) Math.Pow( 2, i );
}
}
static void Main() {
IEnumerable<int> powers = Powers( 0, 16 );
foreach( int result in powers ) {
Console.WriteLine( result );
}
}
}1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536