53331


マイクロソフトのリファレンスを見ながらコードを読んでいたのですが`data.Zip(data.Skip(1),(i,j) => j -
i);`の[`(i,j) => j -
i`]の動作はメソッド内部でどのような処理がなされているのか知りたいです。リファレンスを見てもはっきりしないのでご教授お願いします。  
※ラムダ式であることは理解してます。  
.zip() <https://docs.microsoft.com/ja-
jp/dotnet/api/system.linq.enumerable.zip?view=netframework-4.7.2>

[code]

    class Program 
        {              
            static void Main(string[] args)
            {
                var data = Enumerable.Range(0,10);
                foreach(var t in data)
                {
                    Console.WriteLine(t);
                }
                Console.WriteLine();
                var data2 = data.Zip(data.Skip(1),(i,j) => j - i);
                foreach(var i in data2)
                {
                    Console.WriteLine(i);
                }
    
    
                Console.ReadKey();
            }
        }
    
[/code]


CC BY-SA 4.0
2019-03-10T01:13:34.697
53329
2019-03-11T00:50:23.913
2019-03-11T00:50:23.913
76
question
c#
Enumerableのメソッドの.Zip()メソッドでこの場合の動作について知りたい。


[(i,j) => j - i]のZip内部での呼び出され方は次のリンク先のソースコードに記述されています。  
<https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Zip.cs#L65>

引数で渡したラムダ式は次のようなメソッドを表していて、

[code]

    int LambdaFunction(int i, int j)
    {
        return j - i;
    }
    
[/code]

それがZipの中では、

[code]

     using (IEnumerator<int> e1 = data.GetEnumerator())
     using (IEnumerator<int> e2 = data.Skip(1).GetEnumerator())
     {
         while (e1.MoveNext() && e2.MoveNext())
         {
             yield return LambdaFunction(e1.Current, e2.Current);
         }
     }
    
[/code]

のように呼び出されているイメージです。  
誤解を恐れずにZipの部分を展開して書くと次のようなイメージです。  
正確ではないですが同じ出力結果になります。

[code]

    var data      = new int[] {0,1,2,3,4,5,6,7,8,9};
    var dataSkip1 = new int[] {1,2,3,4,5,6,7,8,9};
    
    for (int k = 0; k < data.Length && k < dataSkip1.Length; k++) {
        int i = data[k];
        int j = dataSkip1[k];
        yield return j - i;
    }
    
[/code]

参考：内部的な動作がドキュメントから読み取れない場合は、実際のソースコードを読んでみることをお勧めします。.NETCoreでの実装は上のリンクのようにGithubで見ることができますし、[ILSpy](https://github.com/icsharpcode/ILSpy)などの逆コンパイラツールを使うと自分が書いたコードから内部の実装に辿っていくこともできますよ。


CC BY-SA 4.0
2019-03-10T04:13:13.990
53331
2019-03-10T23:25:02.563
2019-03-10T23:25:02.563
32483
32483
53329
answer