2007年12月28日

C#3.0:varの是非

   このエントリーをはてなブックマークに追加 Clip to Evernote
「R.Tanaka.Ichiro's Blog」暗黙的型付け(その4)

で話題になっていた、varの是非だけれど、
var num = 10;

とか
for (var i = 0; ..

と書くべきかについては、型が明らかなんだから、使ってもいいんじゃない。
というのが僕の考え。
変数 i を、double だと誤解する人はいないだろう。ましてや、i をクラスのオブジェクトを格納する変数だと誤解する人は絶対ないと思う。

ただ、int と書くのがすでに体に染みついているので無意識に int とタイプしちゃう
から、現実的には varは使わないと思う。
でも、以下のような場合は、間違いなくvarを使うと思う。

IEnumerable<Person> query = persons.Where(p => p.Age >= 40);

じゃなくて、
var query = persons.Where(p => p.Age >= 40);


もちろん、クエリ式にしたときもvarを使います。
var query = from p in persons
where p.Age >= 40
select p;


大きな理由は特に無いけど、単にそのほうが楽だし、それで特に困ることもないから。
最初にあげたintをvarにする2つの例は、varと書くことで「楽」にはならないけど、
LINQのコードは、varが圧倒的に楽です。
まあ、人間楽なほうに流れるってことですかね。

とうぜん、この後に続く foreachでもvarを使います。
foreach (var p in query) {
Console.Writeline(p.Name);
}

あえて理由をつけるとすれば、varの方が、後からの変更に強いコードになるってこと
でしょうか?

var query = from p in persons
where p.Age >= 40
select new { p.Name, p.PhoneNo };

と、匿名クラスを返すように変更したときでも、コードを変更する必要が無いですからね。
IEnumerable って書いちゃうと変更が面倒です。
「決定はできるだけ後に延ばせ」っていう原則は、こんな時も生きてきます。というのが僕の考え。
  

Posted by gushwell at 15:28Comments(2)TrackBack(0)

2007年12月26日

Linq to XML その4

   このエントリーをはてなブックマークに追加 Clip to Evernote
Linq to XML その1
Linq to XML その2
Linq to XML その3

属性は、どうやって取得するのでしょうか、そのサンプルを載せます。

XDocument xdoc = XDocument.Load("people.xml");
foreach (var xperson in xdoc.Root.Elements()) {
bool isReal = (bool)xperson.Attribute("IsReal");
if (isReal) {
XElement xname = xperson.Element("Name");
XElement xage = xperson.Element("Age");
Console.WriteLine(xname.Value + ":" + xage.Value + "歳");
}
}



クエリ式を使うと

XDocument xdoc = XDocument.Load("people.xml");
var query = from xperson in xdoc.Root.Elements()
where (bool)xperson.Attribute("IsReal") == true
select new {
Name = xperson.Element("Name").Value,
Age = (int)xperson.Element("Age")
};
foreach (var p in query)
Console.WriteLine(p.Name + ":" + p.Age + "歳");

となります。

Attribute("IsReal")メソッドで、属性を取得し、boolにキャストしています。
  
Posted by gushwell at 20:38Comments(2)TrackBack(0)

2007年12月25日

Linq to XML その3

   このエントリーをはてなブックマークに追加 Clip to Evernote
Linq to XML その1
Linq to XML その2

こんどは、ソートです。
年齢順にソートしてみましょう。

今回も、クエリ式を使ったものと、そうでないものを示します。

XDocument xdoc = XDocument.Load("people.xml");
var sortedPeople = xdoc.Root.Elements().OrderBy(p => (int)p.Element("Age"));
foreach (var xperson in sortedPeople) {
XElement xname = xperson.Element("Name");
XElement xage = xperson.Element("Age");
Console.WriteLine(xname.Value + ":" + xage.Value + "歳");
}


まず、OrderByメソッドでソートしてから、
forearchで順に表示しています。

クエリ式の場合は、

XDocument xdoc = XDocument.Load("people.xml");
var query = from xperson in xdoc.Root.Elements()
orderby (int)xperson.Element("Age")
select new {
Name = xperson.Element("Name").Value,
Age = (int)xperson.Element("Age")
};
foreach (var p in query)
Console.WriteLine(p.Name + ":" + p.Age + "歳");


となります。
やはり、orderby演算子を使って、ソートしています。
逆順にソートする場合は、

orderby (int)xperson.Element("Age") descending


と書けばOKです。
  
Posted by gushwell at 21:17Comments(1)TrackBack(0)

2007年12月21日

Linq to XML その2

   このエントリーをはてなブックマークに追加 Clip to Evernote
Linq to XML その1

前回のXMLを読み込み、

坂本竜馬:35歳
井伊直弼:44歳
...

のように表示するにはどうしたらよいでしょうか?
前回の応用ですね。

XDocument xdoc = XDocument.Load("people.xml");
foreach (var xperson in xdoc.Root.Elements()) {
XElement xname = xperson.Element("Name");
XElement xage = xperson.Element("Age");
Console.WriteLine(xname.Value+":"+xage.Value+"歳");
}


クエリ式だと、

XDocument xdoc = XDocument.Load("people.xml");
var query = from xperson in xdoc.Root.Elements()
select new {
Name = xperson.Element("Name").Value,
Age = (int)xperson.Element("Age")
};
foreach (var p in query)
Console.WriteLine(p.Name + ":" + p.Age +"歳");


となります。
クエリ式を使ったコードの例では、出力時に、Name, Ageプロパティが使えているのことに注目ですね。
さらに、Ageプロパティの型が、intになっていることにも注目です。
XElement型は、intや、decimalなどの型にキャストできるようになっています。
  
Posted by gushwell at 00:05Comments(1)TrackBack(0)

2007年12月18日

Linq to XML その1

   このエントリーをはてなブックマークに追加 Clip to Evernote
Linq to XMLについて調べてみましたので、それを備忘として残しておくことにします。
ちょこっと使った感じでは、DOMなどの既存のXMLインターフェースよりもかなり使いやすいという印象です。

LINQ to XML 目次はこちら


では、以下のXMLファイルを使ったコードを書いてみましょう。

<?xml version="1.0" encoding="utf-8"?>
<People>
<Person IsReal="true">
<Name>坂本竜馬</Name>
<Age>35</Age>
</Person>
<Person IsReal="true">
<Name>井伊直弼</Name>
<Age>44</Age>
</Person>
<Person IsReal="false">
<Name>明智小五郎</Name>
<Age>39</Age>
</Person>
<Person IsReal="true">
<Name>勝海舟</Name>
<Age>18</Age>
</Person>
<Person IsReal="true">
<Name>西郷隆盛</Name>
<Age>52</Age>
</Person>
<Person IsReal="false">
<Name>両津勘吉</Name>
<Age>40</Age>
</Person>
</People>


まずは、名前を抜き出すコードを。

XDocument xdoc = XDocument.Load("people.xml");
foreach (var xperson in xdoc.Root.Elements()) {
XElement xname = xperson.Element("Name");
Console.WriteLine(xname.Value);
}


XDocument.LoadでファイルからXMLを読み込み、XDocumentインスタンスを得ます。
xdoc.Rootで、ルートエレメント"People" を、Elements()で、Root直下の要素リストを取得し、forearchでループさせています。

ループの中では、Person要素の配下にある "Name"要素を取得し、その値を表示しています。

同じ結果を出すコードをLinqのクエリ式を使うと

XDocument xdoc = XDocument.Load("people.xml");
var query = from xperson in xdoc.Root.Elements()
select xperson.Element("Name").Value;
foreach (var p in query)
Console.WriteLine(p);


となります。

前者の拡張メソッドを使ったコードは、クエリ式と同等のコードになっていませんが、あえて別の書き方にしています。
  
Posted by gushwell at 21:33Comments(1)TrackBack(0)

2007年12月16日

C#プログラミングレッスン読者数

   このエントリーをはてなブックマークに追加 Clip to Evernote
メルマガ『C#プログラミングレッスン』の読者数が、メルマまぐまぐ合わせて、1400名を突破しました。
次の目標は、1500名ですね。

今、マルチスレッドの説明をしていますが、後2回で終了させ、来年からは、C#3.0の解説に入りたいと思っています。
ただ、ちょっと疲れ気味なので、しばらくお休みをいただこうかなと、思ってみたり。。。



  
Posted by gushwell at 23:03Comments(2)TrackBack(0)

2007年12月13日

LINQ to SQL 遅延ローディング

   このエントリーをはてなブックマークに追加 Clip to Evernote
LINQ to SQL のデザイナー画面で、エンティティ・クラスのDelay Loaded プロパティ
をFalse から true にすることで、遅延ロードにすることができる。
たとえば、CategoriesテーブルのPicture項目を遅延ロードに設定すれば、

var categories = from c in db.Category
where c.CategoryID < 3
select c;
foreach (var c in categories) {
Console.WriteLine(c.CategoryName);
}


というコードを起動しても、Picture項目を取得する SQL文は発行されない。

foreach (var c in categories) {
byte[] pic = c.Picture;
}


と参照したときに、初めて、Picture項目を取得する SQL文が発行される。

すごいなー。  
Posted by gushwell at 21:38Comments(2)TrackBack(0)

2007年12月09日

「C#プログラミングレッスン」 C#2,0編

   このエントリーをはてなブックマークに追加 Clip to Evernote
Gushwell's C# Programing Page --「窓際プログラマーの独り言」別館で、メールマガジン『C#プログラミングレッスン』のバックナンバー「C#2.0編」をダウンロードできるようにしました。

ジェネリック, 匿名メソッド, イテレータ, nullable Type, staticクラス, Property accessor accessibilityなどC#2.0で新たに導入された文法について説明しています。

  
Posted by gushwell at 13:08Comments(0)TrackBack(0)