Eğer bir IEnumerator değişkeni varsa, onu alan bir lambda fonksiyonuna sahip olmak mümkün, MoveNext() ile onu ilerletir ve her seferinde geçerli değeri döndürür.Bir numaralayıcıyı ilerletmek ve değerini bir lambda almak mümkün mü?
1
A
cevap
4
e => e.MoveNext() ? e.Current : null
Bu numaralandırıcıyı ilerletmek ve mevcut değer döndürmek ve numaralandırma işlemi tamamlandığında null adlı dönecektir.
1
A Lambda ifadesi karmaşık ifadeler içerebilir, bu nedenle aşağıdakileri yapabilirsiniz:
Func<IEnumerator, object> f = ie => { ie.MoveNext(); return ie.Current; };
0
Bu sizin için mi arıyorsunuz?
List<string> strings = new List<string>()
{
"Hello", "I", "am", "a", "list", "of", "strings."
};
IEnumerator<string> e = strings.GetEnumerator();
Func<string> f =() => e.MoveNext() ? e.Current : null;
for (; ;)
{
string str = f();
if (str == null)
break;
Console.Write(str + " ");
}
bir IEnumerator
noktası zaten başa sözdizimsel şeker olsun şudur:
foreach (string str in strings)
Console.Write(str + " ");
bile numaralayıcı doğrudan bu durumda daha temiz görünüyor taşıma:
while (e.MoveNext())
Console.Write(e.Current + " ");
0
genişletme Abe çözümüne ilişkin olarak, numaralandırıcıya bir başvuru tutmak için kapatma noktalarını da kullanabilirsiniz:
var iter = ((IEnumerable<char>)"hello").GetEnumerator();
//with closure
{
Func<object> f =
() =>
{
iter.MoveNext();
return iter.Current;
};
Console.WriteLine(f());
Console.WriteLine(f());
}
//without closure
{
Func<IEnumerator, object> f =
ie =>
{
ie.MoveNext();
return ie.Current;
};
Console.WriteLine(f(iter));
Console.WriteLine(f(iter));
}