ソースコード
using System; using System.Collections.Generic; using JetBrains.Annotations; namespace Kogane { public static class IEnumerablePeekExtensionMethods { public static IEnumerable<T> Peek<T> ( [NotNull] this IEnumerable<T> source, [NotNull] Action<T> action ) { if ( source == null ) throw new ArgumentNullException( nameof( source ) ); if ( action == null ) throw new ArgumentNullException( nameof( action ) ); IEnumerable<T> Iterator() { foreach ( var x in source ) { action( x ); yield return x; } } return Iterator(); } public static IEnumerable<T> PeekMany<T> ( [NotNull] this IEnumerable<T> source, [NotNull] Action<IEnumerable<T>> action ) { if ( source == null ) throw new ArgumentNullException( nameof( source ) ); if ( action == null ) throw new ArgumentNullException( nameof( action ) ); IEnumerable<T> Iterator() { action( source ); foreach ( var x in source ) { yield return x; } } return Iterator(); } } }
使用例
using System.Linq; using Kogane; using UnityEngine; public class Example : MonoBehaviour { private void Start() { var list1 = Enumerable .Range( 0, 3 ) .Peek( x => Debug.Log( x ) ) .ToArray() ; var list2 = Enumerable .Range( 0, 3 ) .PeekMany( x => Debug.Log( string.Join( "\n", x ) ) ) .ToArray() ; } }