, . , GetPersons():
static Person[] GetPersons()
{
return new Person [ ] {
new Person { FirstName="Damon", LastName="Hill" },
new Person { FirstName="Niki", LastName="Lauda" },
new Person { FirstName="Ayrton", LastName="Senna" },
new Person { FirstName="Graham", LastName="Hill" }
};
}
, DisplayPersons():
static void DisplayPersons(Person[] persons)
{
//...
. , , . , object[] Person[]:
static void DisplayArray(object[] data).
{
//...
}
, , .
, . Person object, mo object , object. , . , Person object, .
ArraySegment<T>
ArraySegment<T> . , . , , ArraySegment<T>. ( ) .
SumOfSegments ArraySegment<int> , , :
static int SumOfSegments(ArraySegment<int>[] segments)
{
int sum =0;
foreach (var segment in segments)
{
for (int i=segment.Offset; i<segment.Offset+segment.Count; i++)
{
sum += segment.Array[i];
}
}
return sum;
}
. ar1, , - r2, :
int[] ar1 = { 1, 4, 5, 11, 13, 18 };
int[] ar2 = { 3, 4, 5, 18, 21, 27, 33 };
var segments = new ArraySegment<int>[2]
{
new ArraySegment<int>(ar1, 0, 3),
new ArraySegment<int>(ar2, 3, 3)
};
var sum = SumOfSegments(segments);
, . ArraySegment<T> , .
|
|
foreach (. 6.10) . foreach (enumerator). . 6.7 , foreach, . IEnumerable GetEnumerator(). GetEnumerator() , IEnumerable. IEnumerable foreach .
GetEnumerator() IEnumerable. foreach , . GetEnumerator(), , IEnumerator.
6.7 - , foreach,
IEnumerator
foreach IEnumerator . IEnumerator Current , , MoveNext() true, , false, .
IEnumerator<T> - IDisposable, Dispose() , .
lEnumerator Reset() . .NET NotSupportedException.
foreach
foreach C# foreach IL. C# foreach IEnumerable. foreach :
foreach (var in persons)
{
Console.WriteLine();
}
foreach . GetEnumerator() . while - , MoveNext() true - Current:
IEnumerator<Person> enumerator = persons.GetEnumerator();
while (enumerator.MoveNext())
{
Person p = (Person)enumerator.Current;
Console.WriteLine(p);
}
yield
C# foreach. C# 1.0 . C# 2.0 yield . yield return , yield break .
yield return. HelloCollection GetEnumerator(). GetEnumerator () yield return, "Hello" "World".
|
|
using System;
using System.Collections;
namespace Wrox.ProCSharp.Arrays
{
public class HelloCollection
{
public XEnumerator<string> GetEnumerator()
{
yield return "Hello";
yield return "World";
}
}
, yield, . IEnumerator IEnumerable . yield return yield break; return .
foreach:
public void HelloWorld()
{
var helloCollection = new HelloCollection();
foreach (string s in helloCollection)
{
Console.WriteLine(s);
}
}
}
yield, , . yield IEnumerator IDisposable. yield Enumerator. GetEnumerator() yield. yield state , MoveNext(). MoveNext() , Current , .
public class HelloCollection
{
public IEnumerator GetEnumerator()
{
return new Enumerator (0);
}
public class Enumerator: IEnumerator<string>,IEnumerator,IDisposable
{
private int state;
private object current;
public Enumerator(int state)
{
this.state = state;
}
bool System.Collections.IEnumerator.MoveNext()
{
switch (state)
{
case 0:
current = "Hello";
state = 1;
return true;
case 1:
current = "World";
state = 2;
return true;
case 2:
break;
}
return false;
}
string System.Collections.Generic.IEnumerator<string>.Current
{
get
{
return current;
}
}
object System.Collections.IEnumerator.Current
{
get
{
return current;
}
}
void IDisposable.Dispose()
{
}
}
}
, ield , , . foreach. , foreach, . .