[C#] クラスのListから任意の条件に一致する要素のみ取得する(LINQ編)

Pocket

ここでは、あるクラスオブジェクトのリストから任意の条件に一致するリストのみ取得するサンプルコードを掲載しています。

スポンサーリンク

 

クラスのリストから任意の条件に一致する要素を取得する

次のクラスのリストを考えます。

public class sampleClass
{
    public string Name { get; set; } // 名前
    public DateTime Birthday { get; set; } // 誕生日

    // 2000年に生まれはtrue 
    public bool BornIn2000()
    {
        // 2000年生まれ
        if(this.Birthday.Year == 2000)
        {
            return true;
        }
        return false;
    }
}

 

大方の予想はできると思いますが、sampleClassのリストから2000年生まれのオブジェクトのみ取り出して、新しいリストを作成するには、次のように記述することができます。

 

    List<sampleClass> sourceList;

    // ここでsoueceListにsampleClassを追加する
    // このサンプルでは省略    

    // 2000年生まれのリストを取得する
    List<sampleClass> bornIn2000;
    bornIn2000 = sourceList.Where(item => item.BornIn2000()).ToList();

 

List は、Where でSQLのように条件を設定できるようになっています。LINQというみたいですが、実はたいして理解していないので、特に言及できません。。。。

しかし、上記のように記述できれば、自分でループを回す必要がなく、非常にスッキリとします。スッキリと記述できれば、それだけでも非常に大きな利点だと思いますので、覚えておいて損はないでしょう。

もしかして時代おくれ???そんな気もするな。。。

 

ついでにリストをソートしてみる

何のついでかわかりませんが、上記のリストを誕生日の昇順で並び替えてみたいと思います。(お年寄りほど先頭にくるリストです)

 


// 誕生日の昇順で並び替え
sourceList.Sort((x, y) => x.Birthday.CompareTo(y.Birthday));

// 誕生日の降順で並び替え
//sourceList.Sort((x, y) => y.Birthday.CompareTo(x.Birthday));


 

要素と要素を比較して、先頭に配置させたい場合は-1を、一緒の場合は0を、後ろに配置させたい場合は1をリターンさせています。

もちろん、次のように複数行に渡って条件を細かく記述することもできます。サンプルの比較に意味はありません。単純に複数行に渡って記述することもできるということです。

 

  sourceList.Sort((x, y) => {

                if(x.Birthday.Hour < y.Birthday.Hour)
                {
                    return -1;
                }
                return 1;      
            });

ただ、このSort関数は、リターン値がないことからも分かるように、元のリストそのものを並び替えてしまいますので、注意するポイントです。

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *