LINQ to Object
ここまでの説明では、LINQを主にリレーショナルデータベースに対して使用するものとして紹介してきた。しかしLINQは、その他のデータソースも同じように対象にすることが可能である。例えばLINQ to Objectはメモリ内部のコレクションオブジェクトに対するクエリーを行う機能を提供する。
リスト7のプログラムは、コレクションオブジェクトproductsに対して、LINQがクエリーを発行している例である。非常に簡単な例であるが、コレクションの抽出が簡潔に実装できていることを確認していただけると思う。
また、注目して欲しいのは、データベースアクセスと同じ構文で、メモリ内部のコレクションオブジェクトに対してクエリーを行っている点である。なおVisual Studio 2008で作成されたクラスは、あらかじめLINQを使用できる設定になっているため、LINQ to Object用に特別な設定は必要ない。
LINQ to Xml
次に、LINQを使用してXMLデータをクエリーする例を紹介しよう。XMLを検索する方法としては、XmlReaderまたはXmlWriter APIを使用することが一般的であるが、LINQを使用することで、リスト8〜9のように非常に効率よくコーディングすることができる。
応用例
ここから先の応用方法は開発者の方々の多彩なアイデアにお任せしたいと思うが、例えばリスト10のようなテキストファイルから特定の文字をGrepするサンプルなどはすぐに思いつくだろう。
リスト7:LINQ to Objectの例
public class Product
{
public string Name { get; set; }
public string Type { get; set; }
}
public static void Main(string[] args)
{
List<Product> products = new Listt<Product>
{
new Product{Name="クッキー", Type="洋菓子"},
new Product{Name="チョコレート", Type="洋菓子"},
new Product{Name="ようかん", Type="和菓子"},
new Product{Name="だいふく", Type="和菓子"}
};
var query = from p in products
where p.Type == "洋菓子"
orderby p.Name
select p;
foreach(Product p in query)
Console.WriteLine(p.Name);
}
s
リスト8:データソースとなるXMLファイル(products.xml)
t<?xml version="1.0" encoding="utf-8" ?>
- t<products>
- t<product type="洋菓子">
t<Name>クッキーt</Name>
t</product>
- t<product type="洋菓子">
t<Name>チョコレートt</Name>
t</product>
- t<product type="和菓子">
t<Name>ようかんt</Name>
t</product>
- t<product type="和菓子">
t<Name>だいふくt</Name>
t</product>
t</products>
リスト9:LINQ to XMLの例
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"C:\products.xml");
var query =
from p in doc.Descendants("product")
where p.Attribute("type").Value == "洋菓子"
orderby p.Element("Name").Value
select new
{
Name = p.Element("Name").Value
};
foreach(var q in query)
Console.WriteLine(q.Name);
}
リスト10:LINQ to Objectを使用した応用例
public static void Main(string[] args)
{
System.IO.StreamReader str= new System.IO.StreamReader(
@"C:\readme.txt", Encoding.GetEncoding("Shift_JIS"));
string text = str.ReadToEnd();
str.Close();
Listt<string> lsttext = new Listt<string>(text.Split(new char[] { '\n' }));
var ret= from t in lsttext
where t.Contains("Grepしたい文字列")
select t;
foreach(var r in ret)
Console.WriteLine(r);
}
次回は
以上、LINQがどのようなものであるかご理解いただくため、可能な限り簡単なサンプルを使って紹介を行ってきた。しかし、これらは多数あるLINQテクノロジーのほんの一端に過ぎない。
LINQは実に多くの応用が期待できる非常に懐の深いテクノロジーである。はじめて構文を見ると奇異に感じるかもしれないが、その構文やコンセプトに精通していただきぜひ開発に役立てて欲しい。
さて、次回はADO.NET Entity Frameworkによるデータアクセスの実装方法について解説していく。