今回は、クエリキーワードの中でもselectと並んで必ず見る
fromです。
そのままの動作ですが、元となるデータから
一つずつ要素を取り出してくれます。
inの右にかけるのは以下のインターフェースを実装しているクラスとなります。
- IEnumerable
- IEnumerable
- IQueryable
基本的に以下のように型推論を利用して記述します。
from x in enumerableObjects
複数のfromを記述する事も出来ます。
from x in ListA from y in x.ListB
但し、ArrayListのようにIEnumerableを実装している
クラスの場合は、明示的に型を指定する必要があります。
from string x in arrayList
以下、サンプルです。
#region LinqSamples-02 public class LinqSamples02 : IExecutable { class Person { public string Id{ get; set; } public string Name{ get; set; } public AddressInfo Address{ get; set;} } class AddressInfo { public string PostCode{ get; set; } public string Prefecture{ get; set; } public string Municipality{ get; set; } public string HouseNumber{ get; set; } public string[] Tel{ get; set; } public string[] Frends{ get; set; } } IEnumerable<Person> CreateSampleData() { return new Person[]{ new Person{ Id="00001" ,Name="gsf_zero1" ,Address=new AddressInfo{ PostCode="999-8888" ,Prefecture="東京都" ,Municipality="どこか1" ,HouseNumber="番地1" ,Tel=new []{"090-xxxx-xxxx"} ,Frends=new string[]{} } } ,new Person{ Id="00002" ,Name="gsf_zero2" ,Address=new AddressInfo{ PostCode="888-7777" ,Prefecture="京都府" ,Municipality="どこか2" ,HouseNumber="番地2" ,Tel=new []{"080-xxxx-xxxx"} ,Frends=new []{"00001"} } } ,new Person{ Id="00003" ,Name="gsf_zero3" ,Address=new AddressInfo{ PostCode="777-6666" ,Prefecture="北海道" ,Municipality="どこか3" ,HouseNumber="番地3" ,Tel=new []{"070-xxxx-xxxx"} ,Frends=new []{"00001", "00002"} } } ,new Person{ Id="00004" ,Name="gsf_zero4" ,Address=new AddressInfo{ PostCode="777-6666" ,Prefecture="北海道" ,Municipality="どこか4" ,HouseNumber="番地4" ,Tel=new []{"060-xxxx-xxxx", "111-111-1111", "222-222-2222"} ,Frends=new []{"00001", "00003"} } } }; } public void Execute() { IEnumerable<Person> persons = CreateSampleData(); // // 一つのfrom // 尚、以下のように何もせずに元のままの結果を返すクエリを // 縮退クエリと言うらしいです。 // var query1 = from person in persons select person; foreach(var person in query1) { Console.WriteLine("Id={0}, Name={1}", person.Id, person.Name); } // // 複数のfrom. // var query2 = from person in persons from tel in person.Address.Tel select new{ Id=person.Id, Tel=tel }; foreach(var data in query2) { Console.WriteLine("Id={0}, PostCode={1}", data.Id, data.Tel); } // // IEnumerableを実装している場合は明示的な型指定が必要. // ArrayList aryList = new ArrayList(new string[]{"hoge", "moge", "fuga"}); var query3 = from string element in aryList select element; foreach(var element in query3) { Console.WriteLine(element); } } } #endregion