LINQ to Objectで抽出と並び替え(List<T>編)
※この投稿はMicrosoft Visual Studio 2008 Beta2で動作を確認しています。
やっと最近LINQに触り始めて、今一番楽しいところなんで、自分がやってみたことをまとめていきたいと思います。
まぁ、まだまだこんなことができるんだぁ、と文法を追っているレベルなんで、たいしたことは書けないですが。
ということで、まずはListに格納されているオブジェクトを操作してみます。
何はともあれソースから。
using System;
using System.Collections.Generic;
using System.Linq;
namespace LINQ1
{
class Person
{
public string Name { get; set; }
public int Gender { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Person> People = new List<Person>{
new Person{ Name="オサダ トシヒロ", Gender=1, Age=32},
new Person{ Name="カネフジ タカエ", Gender=2, Age=46},
new Person{ Name="キョウゴク トシツグ", Gender=1, Age=11},
new Person{ Name="コウダ キミタカ", Gender=1, Age=17},
new Person{ Name="シモイズミ エイコ", Gender=2, Age=13},
new Person{ Name="センザイ シュウイチロウ", Gender=1, Age=43},
new Person{ Name="ソウリョウ ノリカズ", Gender=1, Age=21},
new Person{ Name="マツバネ タツコ", Gender=2, Age=24},
new Person{ Name="ミツジマ タカコ", Gender=2, Age=32},
new Person{ Name="ヤハタ トシチカ", Gender=1, Age=28}
};
var query = from p in People
where p.Gender == 1 && p.Age >= 20
orderby p.Age
select p;
foreach (var item in query)
{
Console.WriteLine("名前={0}, 年齢={1}", item.Name, item.Age);
}
Console.Read();
}
}
}
上記のプログラムでListに格納しているのは名前、性別、年齢というデータを持つ
Personクラスのオブジェクトです。
このオブジェクトの集合の中から、成人(Age>=20)の男性(Gender=1)を取得し、
年齢の順に並べてみています。
結果は次のようになります。
このような結果を得るために、LINQが必ずしも必要なわけではありません。
たとえばList内のデータをひとつずつ取り出して条件に合致するデータだけを残し、
そのデータを並び替えるプログラムを書くことはそれほど難しくないはずです。
ただし、LINQを使うと下記のようにSQL文を書いたことがある人ならすぐに理解できる
簡潔な記述でデータの抽出と並び替えを一度に行うことができます。
var query = from p in People
where p.Gender == 1 && p.Age >= 20
orderby p.Age
select p;
ちなみに、上記のプログラムは以下のように書くこともできます。
var query = People.Where(p => p.Gender == 1 && p.Age >= 20).OrderBy(p => p.Age);
このWhere()やOrderBy()は拡張メソッドとして実装されています。
実はこの拡張メソッドによる実装がLINQの基礎であって、SQL文のような記述は、コンパイル時に
拡張メソッドを使った方法に置き換えられて実行される、と考えてよいと思います。