[C# LINQ]範囲を指定して要素を取得する

今回は範囲を指定してリストなどの順番に並んだデータから要素を取得する方法についてです。
LINQのTakeメソッド、Skipメソッドを組み合わせて使います。
また、C#10からTakeメソッドにRangeクラスが指定できるようになったのでそれを使っての範囲指定についても紹介します。

目次

Take、Skipメソッドの使い方

Takeメソッドは先頭から引数で指定された数だけ要素を取り出します。
Skipメソッドは先頭から引数で指定された数だけ飛ばしその後ろから要素を取り出します。
この2つのメソッドを組み合わせて、範囲を指定して要素を取り出すことが出来ます。
Skipメソッドで開始地点を指定してTakeメソッドでそこから何個要素を取り出すかを指定します。
こんなイメージ、

コードはこんな感じ

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqTest;
class Program
{
    static void Main() {
        //取得対象のリスト
        var list = new List<int> { 0, 1, 2, 3, 4, 5 };

        //インデックス1、2,3を取得
        foreach (var item in list.Skip(1).Take(3)) { 
            Console.WriteLine(item);
        }
    }
}
1
2
3

Takeメソッドの引数に対象の要素より大きい数を指定した場合は残りすべて要素が返ってきます。Skipメソッドの場合は空のリストが返ってきます。

TakeメソッドにRangeを渡して範囲指定する

C#10からTakeメソッドのオーバーロードが追加され引数にRangeを指定できるようになりました。
Rangeは「start..end」という構文で指定することができます。startとendの部分にインデックスを指定するのですが、endのインデックスは含まない範囲になるので注意してください。
上記サンプルと同じようにインデックス1,2,3の範囲を指定したい場合「1..4」となります。
また「^1」のようにすると末尾から1番目という意味になります。

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqTest;
class Program
{
    static void Main() {
        //取得対象のリスト
        var list = new List<int> { 0, 1, 2, 3, 4, 5 };

        //インデックス1、2,3を取得
        Console.WriteLine($"1..4  : {string.Join(",", list.Take(1..4))}");
        Console.WriteLine($"1..^2 : {string.Join(",", list.Take(1..^2))}");
    }
}
1..4  : 1,2,3
1..^2 : 1,2,3

こんな感じでRangeが使えるところが増えました。
ちなみに他には文字列の切り出しに使えたりします。詳しくはこちらの記事を見てみてください。

以上です。


LINQ関連記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次