※この投稿はMicrosoft Visual Studio 2008 Beta2で動作を確認しています。
以前の記事でLINQ to XMLではデータを適切な型にキャストする必要がある、と書いたのですが、そのデータ型の変換がずっと簡単にできることが「XML データ用の .NET 統合言語クエリ」の記事を読んでわかりました。
●以前のプログラム
var query = from p in People.Descendants("Person")
where int.Parse(p.Element("Gender").Value) == 1 && int.Parse(p.Element("Age").Value) >= 20
orderby int.Parse(p.Element("Age").Value)
select p;
○修正したプログラム
var query = from p in People.Descendants("Person")
where (int)p.Element("Gender") == 1 && (int)p.Element("Age") >= 20
orderby (int)p.Element("Age")
select p;
XMLのエレメントを特定したらそこに直接(int)と書くことでキャストが行われます。
適切な型が何かを知っておく必要はありますが、これなら記述も簡単ですよね。
※修正後の全プログラム
using System;
using System.Linq;
using System.Xml.Linq;
namespace LINQ3
{
class Program
{
static void Main(string[] args)
{
XElement People = XElement.Parse(
@"<People>
<Person>
<Name>オサダ トシヒロ</Name>
<Gender>1</Gender>
<Age>32</Age>
</Person>
<Person>
<Name>カネフジ タカエ</Name>
<Gender>2</Gender>
<Age>46</Age>
</Person>
<Person>
<Name>キョウゴク トシツグ</Name>
<Gender>1</Gender>
<Age>11</Age>
</Person>
<Person>
<Name>コウダ キミタカ</Name>
<Gender>1</Gender>
<Age>17</Age>
</Person>
<Person>
<Name>シモイズミ エイコ</Name>
<Gender>2</Gender>
<Age>13</Age>
</Person>
<Person>
<Name>センザイ シュウイチロウ</Name>
<Gender>1</Gender>
<Age>43</Age>
</Person>
<Person>
<Name>ソウリョウ ノリカズ</Name>
<Gender>1</Gender>
<Age>21</Age>
</Person>
<Person>
<Name>マツバネ タツコ</Name>
<Gender>2</Gender>
<Age>24</Age>
</Person>
<Person>
<Name>ミツジマ タカコ</Name>
<Gender>2</Gender>
<Age>32</Age>
</Person>
<Person>
<Name>ヤハタ トシチカ</Name>
<Gender>1</Gender>
<Age>28</Age>
</Person>
</People>");
var query = from p in People.Descendants("Person")
where (int)p.Element("Gender") == 1 && (int)p.Element("Age") >= 20
orderby (int)p.Element("Age")
select p;
foreach (var item in query)
{
Console.WriteLine("名前={0}, 年齢={1}", (string)item.Element("Name"), (int)item.Element("Age"));
}
Console.Read();
}
}
}