class Program
{
static void Main(string[] args)
{
int[] numbers = { 1, 2, 3, 4, 5, 6, 7 };
IEnumerable<int> circularNumbers = numbers.AsCircular();
IEnumerable<int> firstFourNumbers = circularNumbers.Take(4); // 1 2 3 4
IEnumerable<int> nextSevenNumbersfromfourth = circularNumbers
.Skip(4).Take(7); // 4 5 6 7 1 2 3
}
}
public static class CircularEnumerable
{
public static IEnumerable<T> AsCircular<T>(this IEnumerable<T> source)
{
if (source == null)
yield break; // be a gentleman
IEnumerator<T> enumerator = source.GetEnumerator();
iterateAllAndBackToStart:
while (enumerator.MoveNext())
yield return enumerator.Current;
enumerator.Reset();
if(!enumerator.MoveNext())
yield break;
else
yield return enumerator.Current;
goto iterateAllAndBackToStart;
}
}
あなたはCircularList
を作り、あなたのサンプルのように回転させたときSkip()
をスキップするために、同じ列挙子を保持し、さらに行きたい場合。
それはちょうど完璧な男です、ありがとう!スタイルを改善するために、 '??'演算子:return current.Next ?? current.List.First; – Julien
@Julien言語の複雑さは必ずしも読みやすくするものではありません。 –
ここで重要な点の1つは、ノード自体がリンクされていない場合、 'current.List'が潜在的にnullになる可能性があることです。 https://msdn.microsoft.com/en-us/library/h339c45b(v=vs.110).aspxを参照してください。 –