【C#】LINQを使って「三角数列(数値リストの先頭から各項までの合計の数値リスト)」を作る。

非常に言葉で説明するのは難しいのですが、ある数値リストがあったとき、そのリストの各項までの合計値を持つリストを作る処理を紹介します(どうやら「三角数列」と呼ぶらしいです)。

イメージは以下の通りです。

List<int> {1 ,2 ,3 ,4, 5, 6, 7, 8, 9, 10}

List<int> {1 ,3 ,6 ,10, 15, 21, 28, 36, 45, 55}

例えば第3項は「1 + 2 + 3 = 6」になります。

実装

public  class Program
{
    static void Main(string[] args)
    {
        // 対象の数列リスト
        var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        // 三角数列を作成
        var tsNumbers = numbers
            .Select((number, index) => numbers.Take(index + 1).Sum());

        // 表示(確認用)
        foreach (var tsNumber in tsNumbers)
        {
            Console.Write($"{tsNumber}, ");
        }
    }
}

1, 3, 6, 10, 15, 21, 28, 36, 45, 55,

今回使うLINQメソッド

ひじょ~に言葉で説明しずらいのですが、簡単に今回使用したLINQメソッドを紹介します。

Select((x, i) => { … })

Selectメソッドに渡す匿名メソッドの引数(「(x, i)」の部分)には、2つの引数を指定できます。

  • 第一引数「x」・・・リストの各要素
  • 第二引数「i」・・・現在のインデックス( 0 ~ count – 1 )

これを使うことで、匿名メソッドの処理部(「{ … }」の部分)で、リストの各要素だけでなく現在の要素のインデックスも使用することができます。

Take(count)

Takeメソッドの引数に「取り出したい要素数」を指定することで、リストの先頭から指定要素数までのリストを取得できます。

例えばTake(3)とすると、リストのインデックス「0」から「2」の3つの要素範囲を取り出せます。

これらSelectとTakeメソッドを組み合わせることで今回の処理を実現しています。

コメント