/// <summary>シーケンス内に指定した要素が存在する場合、その位置へ移動する。</summary> /// <typeparam name="T">要素の型</typeparam> /// <param name="scroller">対象インスタンス</param> /// <param name="element">要素</param> /// <returns>結果</returns> public static ResultWithValue <IElementScroller <T> > TryMoveTo <T>(this IElementScroller <T> scroller, T element) { if (scroller.GetSequence().Contains(element)) { return(new ResultWithValue <IElementScroller <T> >(scroller.MoveTo(element))); } else { return(new ResultWithValue <IElementScroller <T> >(false, scroller)); } }
/// <summary>シーケンス内に条件を満たす要素が存在する場合、最後に見つかった要素の位置へ移動する。</summary> /// <typeparam name="T">要素の型</typeparam> /// <param name="scroller">対象インスタンス</param> /// <param name="predicate">条件</param> /// <returns>結果</returns> public static ResultWithValue <IElementScroller <T> > MaybeLast <T>(this IElementScroller <T> scroller, Predicate <T> predicate) { if (scroller.GetSequence().Any(x => predicate(x))) { return(new ResultWithValue <IElementScroller <T> >(scroller.Last(predicate))); } else { return(new ResultWithValue <IElementScroller <T> >(false, scroller)); } }
/// <summary>現在の位置より前にあるシーケンスから現在のノードに近い順のシーケンスを取得する。</summary> static IEnumerable <T> previousSequence <T>(this IElementScroller <T> scroller) { return(scroller.GetSequence() .TakeWhile(x => !Equals(x, scroller.Current)) .Reverse()); }
/// <summary>現在の位置が巡回シーケンスの最後かどうかを示す値を取得する。</summary> /// <typeparam name="T">要素の型</typeparam> /// <param name="scroller">対象インスタンス</param> /// <param name="predicate">条件を表す関数</param> public static bool IsLast <T>(this IElementScroller <T> scroller, Predicate <T> predicate) { return(Equals(scroller.Current, scroller.GetSequence().LastOrDefault(x => predicate(x)))); }
/// <summary>現在の位置の後ろに続くシーケンスを取得する。</summary> static IEnumerable <T> nextSequence <T>(this IElementScroller <T> scroller) { return(scroller.GetSequence() .SkipWhile(x => !Equals(x, scroller.Current)) .Skip(1)); }
/// <summary>シーケンス内の条件を満たす最後の位置へ移動する。</summary> /// <typeparam name="T">要素の型</typeparam> /// <param name="scroller">対象インスタンス</param> /// <param name="predicate">条件</param> public static IElementScroller <T> Last <T>(this IElementScroller <T> scroller, Predicate <T> predicate) { var s = scroller.GetSequence().Last(x => predicate(x)); return(scroller.MoveTo(s)); }
/// <summary>シーケンス内の最後の位置へ移動する。</summary> /// <typeparam name="T">要素の型</typeparam> /// <param name="scroller">対象インスタンス</param> public static IElementScroller <T> Last <T>(this IElementScroller <T> scroller) { //return scroller.Move(scroller.GetSequence().Count() - scroller.CurrentIndex - 1); return(scroller.MoveTo(scroller.GetSequence().Count() - 1)); }