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メソッドを紹介しました。
使えるタイミングを考えてみました。
それは、フォーマットの決まったファイル読み込み後に、必要な部分を抽出したい時に使えそうです。
クエリ構文では作られていないメソッドの為、必要性は低いのかもしれません。
もう少し組み合わせると、移動平均の関数を作れるような気がしました。
機会があれば、移動平均を求める関数を紹介してみたいと思います。
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント