systembankスタッフのブログ

システムバンクスタッフのブログです。

LINQの話 その3

今回は選択

集合をSQLのように扱うことができることのうち、情報の選択に相当するSelectメソッドについて説明使用と思います。

Selectってなにか

堅苦しくいうと集合内の要素のうち特定の者のみを選択するというところでしょうか。

逆をいえば以降の処理で不要なものを省くこともできるのですっきりできるのが良いところでしょうか

用途もSQLのSelectと同じなのでSQLがわかれば何も難しくないかもですね。

どんな感じなのか

Person[] persons = new Person[]
{
    new Person { Name = "Mike", Age = 55 },
    new Person { Name = "Edo", Age = 48 },
    new Person { Name = "Ant", Age = 40 },
};

List<int> ages = new List<int>;
foreach(var p in persons)
{
    list.add(p.Age);
}

person集合から年齢のみを選択したリストを作成しました。

これをLINQで記述するとこんな感じになります。

Person[] persons = new Person[]
{
    new Person { Name = "Mike", Age = 55 },
    new Person { Name = "Edo", Age = 48 },
    new Person { Name = "Ant", Age = 40 },
};

List<int>ages = persons.Select(p => p.Age).ToList();

前回までの例と同じく記述が簡潔になります。

SelectManyも便利

LINQのメソッドでSelectに似た動作でSelectManyメソッドがあります。 言葉で説明すると長くなるので具体的な例で説明します。

Person[] persons = new Person[]
{
    new Person 
    { 
        Name = "Mike", 
        Age = 55,  
        Cars = new string[] { "Rover", "Vauxhall", "Morris" } 
    },
    new Person 
    { 
        Name = "Edo", 
        Age = 48,  
        Cars = new string[] {"Caterham", "Marcos" }
    },
    new Person 
    { 
        Name = "Ant", 
        Age = 40, 
        Cars = new string[] {"Alpine", "Venturi"}
    },
};    

List<string> cars = persons.SelectMany(p => p.Cars).ToList();

この例ではPsersonオブジェクトの保持するCarsプロパティをまとめて1つのリストに出来ます。

for構文でこれを記述すると2重ループ構造を記述しなければならないので比べるととても簡潔にかけます。

次回

次はOrderByメソッドについて書こうと思います。