|
|
連載:[完全版]究極のC#プログラミング
Chapter15 LINQとクエリ式
川俣 晶
2010/03/17 |
|
|
15.20 内部列挙を伴うfrom句の二重使用
二重の列挙という問題でもう1つだけ触れておく価値があるのは、1つのソースに階層がある場合である。
たとえば、次のリスト15.25のデータは、「構成員」というリストを含む「家」オブジェクトがリストになっているという二重のリストである。これを一般的にクエリ式で処理すれば、二重の列挙(家の列挙と構成員の列挙)が必要とされる。しかし、次のようにfrom句を二重に使うと、これを単層の列挙に折りたたむことができる。
using System;
using System.Linq;
class 家
{
public string 姓;
public string[] 構成員;
}
class Program
{
static void Main(string[] args)
{
家[] 家々 =
{
new 家() {
姓 = "磯崎",
構成員 = new [] { "波平", "フネ", "カツオ", "ワカメ"},
},
new 家() {
姓 = "フグ山",
構成員 = new [] { "サザエ", "マスオ", "タラオ"},
},
};
foreach (var 人 in from その家 in 家々
from 名 in その家.構成員
select new { その家, 名 })
{
Console.WriteLine("{0}{1}", 人.その家.姓, 人.名);
}
// 出力:
// 磯崎波平
// 磯崎フネ
// 磯崎カツオ
// 磯崎ワカメ
// フグ山サザエ
// フグ山マスオ
// フグ山タラオ
}
}
|
|
リスト15.25 二重のリストを単層に展開した例 |
ここでは、「from その家 in 家々」というfrom句に続いて、そのfrom句の範囲変数「その家」を使った第2のfrom句が「from 名 in その家.構成員」と記述されている。このような使い方は可能であり、すべての組み合わせを列挙してくれる。もちろん、単純な総当たりではないので、「磯崎サザエ」のようなデータ上ありえない名前が出力されることはない。
Insider.NET 記事ランキング
本日
月間