TomoProgの技術書

底辺プログラマーが達人プログラマーになるまで

Listから条件に適応するものだけを抽出したい

皆さん
こんにちは、こんばんは
TomoProgです。

気がつけば2ヶ月ほどブログ更新していなかった!!
まぁいつもどおりあまり気にせず、ゆるく更新していきたいと思います。

今回はC#にて、List型から条件に適応するものを抽出するにはどうしたらいいのだろう?
ということで調べてみました。

それでは頑張っていきましょう。

素直にすべて走査して抽出する

Listの中身をすべて走査して、条件に合うものを抽出していきます。

using System;
using System.Collections.Generic;

namespace console
{
    class Student
    {
        public string name { get; }
        public int score { get; }
        public Student(string name, int score)
        {
            this.name = name;
            this.score = score;
        }
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            List<Student> studentList = new List<Student>();

            // リストに生徒を追加
            studentList.Add(new Student("Tanaka", 60));
            studentList.Add(new Student("Sato", 70));
            studentList.Add(new Student("Aoki", 60));

            // 70点未満の生徒のリストを作成
            List<Student> selectedList = new List<Student>();
            foreach (Student s in studentList)
            {
                if (s.score < 70)
                {
                    selectedList.Add(s);
                }
            }

            // 作成したリストの内容を出力
            foreach (Student s in selectedList)
            {
                Console.WriteLine("Name:{0} Score:{1}"
                  , s.name, s.score);
            }
        }
    }
}
実行結果:
Name:Tanaka Score:60
Name:Aoki Score:60

この方法だと、どのプログラミング言語でも出来そうですが、
せっかくC#を使っているので、C#っぽい書き方をしてみます。

Linqを使って抽出する

Listから条件に適応するものだけを抽出する際は、
LinqというC#独自の技術を使うと
先ほど書いたプログラムよりも圧倒的にキレイに書くことが出来ます。

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

namespace console
{
    class Student
    {
        public string name { get; }
        public int score { get; }
        public Student(string name, int score)
        {
            this.name = name;
            this.score = score;
        }
    }

    class MainClass
    {
        public static void Main(string[] args)
        {
            List<Student> studentList = new List<Student>();

            // リストに生徒を追加
            studentList.Add(new Student("Tanaka", 60));
            studentList.Add(new Student("Sato", 70));
            studentList.Add(new Student("Aoki", 60));

            // 70点未満の生徒のリストを作成
            var selectedList = from x in studentList
                               where x.score < 70
                               select x;

            // 作成したリストの内容を出力
            foreach (Student s in selectedList)
            {
                Console.WriteLine("Name:{0} Score:{1}"
                  , s.name, s.score);
            }
        }
    }
}
実行結果:
Name:Tanaka Score:60
Name:Aoki Score:60

70点未満の生徒のリストを作成するところが先ほどのプログラムと違うことがわかると思います。

Linqを使えばSQL文を発行するようにList型から条件に適応するものだけを抽出することが出来ます。

何事にも慣れは必要だと思いますが、
C#を使うのであればLinqを使って書いたほうが綺麗ですね。

Linqについて詳しく知りたい場合はこちらのサイトが良いと思います。
ufcpp.net

まとめ

今日はListから条件に適応するものだけを抽出するということで、
2つの方法を紹介しました。

どちらの方法でも結果は同じですが、
Linqを使った方が綺麗にコードが書けて可読性も高まると感じました。
C#使うときは積極的に使っていこうと思います。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter