LINQ: Select, SelectMany

LINQが提供する機能を紹介します。

まずは、一番基本的な(よく利用する)機能のSelect, SelectManyから。

select(シーケンスの各要素を新しいフォームに射影)

selectはクラスから特定のプロパティを取り出したり、プロパティ値を加工したりすることができます。

 

例:1-10の各数値を二乗して取得

IEnumerable<int> squares = Enumerable.Range(1, 10).Select(x => x * x);

foreach (int num in squares)
{
    Console.WriteLine(num);
}
/*
 This code produces the following output:

 1
 4
 9
 16
 25
 36
 49
 64
 81
 100
*/
 

例:文字列型を数値型として取得

 

string[] nums = new[] { "1", "2", "3", "4", "5" };

IEnumerable<int> numsInt = nums.Select(x => Int32.Parse(x));

// -> { 1, 2, 3, 4, 5 }

SelectMany(Selectの結果シーケンスを 1 シーケンスに平坦化)

SelectManyは、結果を平坦化するSelectです。

言葉ではイメージしにくいので具体例で理解してください。

例:2重配列を単純配列にする

 

string[][] jaggedArray =

{

    new []{"a", "b", "c"},

    new []{"1", "2", "3"},

    new []{"い", "ろ", "は"},

};

 

IEnumerable<string> flatten = jaggedArray.SelectMany(x => x);

// -> {"a", "b", "c", "1", "2", "3", "い", "ろ", "は"}

例:グループ内の全メンバを取得

class Group

{

    public string Name { get; set; }

    public List<string> Member { get;  set;}

}

 

 

List<Group> company = new List<Group>()

{

 

    new Group() { Name = "総務部", Member = new List<string>() { "徳増", "鈴森" }}, 

    new Group() { Name = "システム開発部", Member = new List<string>() { "清水", "堂山", "久松" }},

}

 

IEnumerable<string> allmembers =  company.SelectMany(n => n.Member);

// -> {"徳増", "鈴森", "清水", "堂山", "久松"}