/// <summary> /// Apply the previously specified action to all elements except the last and then apply a different action to the last one. /// </summary> /// <param name="sequence"></param> /// <param name="action"></param> /// <typeparam name="T"></typeparam> public static void ToAllWithDifferentLast <T>(this IActionApplyingEnumerable <T> sequence, Action <T> action) { if (sequence == null) { throw new ArgumentNullException(nameof(sequence)); } using (var iterator = sequence.Sequence.GetEnumerator()) { var previous = default(T); var any = false; while (iterator.MoveNext()) { if (any) { sequence.Action.Invoke(previous); } previous = iterator.Current; any = true; } if (any) { action.Invoke(previous); } } }
/// <summary> /// Apply the previously specified action to all elements except for the last one. /// </summary> /// <param name="sequence"></param> /// <typeparam name="T"></typeparam> public static void ToAllExceptLast <T>(this IActionApplyingEnumerable <T> sequence) { if (sequence == null) { throw new ArgumentNullException(nameof(sequence)); } foreach (var a in sequence.Sequence.ButLast()) { sequence.Action.Invoke(a); } }
/// <summary> /// Apply the previously specified action to all elements and then apply an additional action to the last one. /// </summary> /// <param name="sequence">Items.</param> /// <param name="action">Action.</param> /// <typeparam name="T">The 1st type parameter.</typeparam> public static void ToAllAndThenApplyToLast <T>(this IActionApplyingEnumerable <T> sequence, Action <T> action) { if (sequence == null) { throw new ArgumentNullException(nameof(sequence)); } var outer = default(T); var any = false; foreach (var a in sequence.Sequence) { outer = a; sequence.Action.Invoke(a); any = true; } if (any) { action.Invoke(outer); } }