【C#】List型とLINQ(Skip/Takeメソッド)

スポンサーリンク

LINQ(リンク)を使いこなす第5弾です。
指定番目以降の要素を抽出するメソッドであり、指定個数の要素を抽出するメソッドを紹介します。
SkipメソッドTakeメソッドです。
この記事では、メソッド構文で紹介します。
Skip/Takeメソッドは、クエリ構文では書くことが出来ません。

前提の定義

NameSpace

using System.Linq;

構造体

struct SchoolClass
{
    internal int Grade;    //年
    internal int ClassNo;  //組
}

データソース(データ元)

//サンプル用のデータ 作成(単純ver)
List<int> lstSample = new List<int> { 4, 16, 8, 2, 1, 2, 8 };
//サンプル用のデータ 作成(構造体ver)
List<SchoolClass> lstSchool = new List<SchoolClass>
{
    new SchoolClass{ Grade=1, ClassNo=1 },  //1年1組(0番目)
    new SchoolClass{ Grade=3, ClassNo=2 },  //3年2組(1番目)
    new SchoolClass{ Grade=1, ClassNo=2 },  //1年2組(2番目)
    new SchoolClass{ Grade=2, ClassNo=2 },  //2年2組(3番目)
    new SchoolClass{ Grade=2, ClassNo=1 },  //2年1組(4番目)
    new SchoolClass{ Grade=3, ClassNo=1 },  //3年1組(5番目)
};

Skipメソッド

Skipメソッドを使ってみる。
指定番目(n番目)以降の要素を取得する。※0番目を1個目
言い換えると『最初の要素から何個の要素を飛ばして取得』にもなります。
※今回使用するリスト[lstSchool]にコメントで何番目か記載しました。

サンプルの内容としては、「2番目以降の要素を取得」します。※0番目を1個目

Console.WriteLine("2番目以降を取得");
List<SchoolClass> lstSmp1 = lstSchool.Skip(2).ToList();
lstSmp1.ForEach(a => Console.WriteLine(a.Grade + "年" + a.ClassNo + "組"));
//結果
//1年2組
//2年2組
//2年1組
//3年1組

仮にリストの個数以上のスキップを行った場合、エラーになりません
個数0個のリストになります。

Console.WriteLine("10番目以降を取得");
List<SchoolClass> lstSmp1 = lstSchool.Skip(10).ToList();
lstSmp1.ForEach(a => Console.WriteLine(a.Grade + "年" + a.ClassNo + "組"));
//結果
//

Takeメソッド

Takeメソッドを使ってみる。
指定個数(n個)の要素を取得する。

サンプルの内容としては、「(最初の要素から)3個の要素を取得」します。

Console.WriteLine("3個取得");
List<SchoolClass> lstSmp2 = lstSchool.Take(3).ToList();
lstSmp2.ForEach(a => Console.WriteLine(a.Grade + "年" + a.ClassNo + "組"));
//結果
//1年1組
//3年2組
//1年2組

仮にリストの個数以上の個数を取得しようとした場合、エラーになりません
全ての要素を取得したリストになります。
サンプルのリストの個数は6個の為、6個すべてを取得しました。

Console.WriteLine("10個取得");
List<SchoolClass> lstSmp2 = lstSchool.Take(10).ToList();
lstSmp2.ForEach(a => Console.WriteLine(a.Grade + "年" + a.ClassNo + "組"));
//結果
//1年1組
//3年2組
//1年2組
//2年2組
//2年1組
//3年1組

SkipメソッドとTakeメソッド

最後に組み合わせて使ってい見ようと思います。
n番目からm個取得したい』という時に使います。
サンプルとして、『2番目(3個目)から3個取得する』サンプルを紹介します。※0番目が1個目

Console.WriteLine("2番目から3個取得");
List<SchoolClass> lstSmp3 = lstSchool.Skip(2).Take(3).ToList();
lstSmp3.ForEach(a => Console.WriteLine(a.Grade + "年" + a.ClassNo + "組"));
//結果
//1年2組
//2年2組
//2年1組

ちなみに、『10番目から10個取得する』という場合どうなるのでしょうか?
※サンプルの要素としては、6個の要素しかありません。

Console.WriteLine("10番目から10個取得");
List<SchoolClass> lstSmp5 = lstSchool.Skip(10).Take(10).ToList();
lstSmp5.ForEach(a => Console.WriteLine(a.Grade + "年" + a.ClassNo + "組"));
//結果
//(なし) ※例外なし

結果としては、エラーも発生せずに処理されました。そして、戻り値のリストの個数は0個でした。

まとめ

今回は、SkipメソッドTakeメソッドを紹介しました。
使えるタイミングを考えてみました。
それは、フォーマットの決まったファイル読み込み後に、必要な部分を抽出したい時に使えそうです。
クエリ構文では作られていないメソッドの為、必要性は低いのかもしれません。
もう少し組み合わせると、移動平均の関数を作れるような気がしました。
機会があれば、移動平均を求める関数を紹介してみたいと思います。

コメント

タイトルとURLをコピーしました