|
// これはHaiku-with-UniLinq-on-Unity.csで呼び出しているZipメソッドにおいて、.NET Framework 4.0以降に対応している |
|
// Enumerable.Zip<TFirst, TSecond, TResult> メソッドと同等の処理を実現するために、 |
|
// プロジェクトにインポートしたUniLinqのEnumerableクラスに追加したメソッドです。 |
|
|
|
#region Zip |
|
// |
|
// 概要: |
|
// 指定された述語関数を使用して 2 つのシーケンスをマージします。 |
|
// |
|
// パラメーター: |
|
// first: |
|
// マージする 1 番目のシーケンス。 |
|
// |
|
// second: |
|
// マージする 2 番目のシーケンス。 |
|
// |
|
// resultSelector: |
|
// 2 つのシーケンスの要素をマージする方法を指定する関数。 |
|
// |
|
// 型パラメーター: |
|
// TFirst: |
|
// 1 番目の入力シーケンスの要素の型。 |
|
// |
|
// TSecond: |
|
// 2 番目の入力シーケンスの要素の型。 |
|
// |
|
// TResult: |
|
// 結果のシーケンスの要素の型。 |
|
// |
|
// 戻り値: |
|
// 2 つの入力シーケンスのマージされた要素が格納されている System.Collections.Generic.IEnumerable<T>。 |
|
// |
|
// 例外: |
|
// System.ArgumentNullException: |
|
// first または second が null です。 |
|
public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>( this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector ) |
|
{ |
|
// 2つのリストとマージする方法を指定した関数がnullでないかをチェックします。 |
|
// このメソッドはあらかじめUniLinqのcheck.csのCheckクラスに定義しておきます。 |
|
Check.ZipSelector( first, second, resultSelector ); |
|
|
|
// firstとsecondの列挙子を取得し、それぞれを列挙します。 |
|
// MoveNextの戻り値がともにtrueの時、resultSelectorに設定した、 |
|
// メソッドを実行し、要素をマージします。 |
|
using( var first_seq = first.GetEnumerator() ) |
|
using( var second_seq = second.GetEnumerator() ) |
|
while( first_seq.MoveNext() && second_seq.MoveNext() ) { |
|
yield return resultSelector( first_seq.Current, second_seq.Current ); |
|
} |
|
} |
|
|
|
#endregion |
|
|
|
|
|
// こちらは上で実装したUniLinq.Enumerable.Zipメソッドから呼び出すZipSelectorメソッドの定義です。 |
|
// UniLinqのCheck.csのCheckクラスへ追加します。 |
|
public static void ZipSelector( object first, object second, object resultSelector ) { |
|
if( first == null ) |
|
throw new ArgumentNullException( "first" ); |
|
if( second == null ) |
|
throw new ArgumentNullException( "second" ); |
|
if( resultSelector == null ) |
|
throw new ArgumentNullException( "resultSelector" ); |
|
} |