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);
// -> {"徳増", "鈴森", "清水", "堂山", "久松"}