2008年02月28日

C#:下限がゼロでない1次元配列はつくれない

   このエントリーをはてなブックマークに追加 Clip to Evernote
C#3.0で、下限がゼロでない配列をArray.CreateInstanceで作成しようと思って、

int[] nums = (int[])Array.CreateInstance(typeof(int), new[] { 50 }, new[] { 2000 });

というコードを書いて、実行させたら、

型 'System.Int32[*]' のオブジェクトを型 'System.Int32[]' にキャストできません

という例外が出た。
C#だと、[*]って使えないから、ダメなのね。
C#では、下限がゼロでない配列は、多次元配列じゃないと使えないみたいです。

Array nums = Array.CreateInstance(typeof(int), new[] { 50 }, new[] { 2000 });

とすれば、Array型として使えるけど、なんだか〜。

まあ、興味本位で使ってみただけなので、使えなくても問題ないですが...  

Posted by gushwell at 20:59Comments(0)TrackBack(0)

2008年02月26日

C#3.0:LINQ 複合キーで結合する

   このエントリーをはてなブックマークに追加 Clip to Evernote
inner joinを実現するLINQのクエリ式は、

var query =
from a in db.TableA
join b in db.TableB on a.ID equals b.ID
select new { ... }


と書けるが、比較するカラムが複数ある場合は、どうやるんだろうか?
無理なのかなと思って調べていたら、書き方がわかった。

var query =
from a in db.TableA
join b in db.TableB on
new { a.ID, a.Name } equals
new { b.ID, b.Name }
select new { ... }


と書けるようだ。へーなるほどね。
こんなところにも、匿名クラスが使えるんだ。
  
Posted by gushwell at 23:09Comments(2)TrackBack(0)

2008年02月20日

LINQ to XML その12−配列からの変換

   このエントリーをはてなブックマークに追加 Clip to Evernote
こんどは、前回の逆のコード

配列のデータを XMLに変換するコードです。
こちらも、LINQを使います。

 var x = new XElement("People",
from p in people
select
new XElement("Person",
new XAttribute("IsReal", p.IsReal),
new XElement("Name",p.Name),
new XElement("Age",p.Age)
)
);
x.Save("people.xml");


かなり簡潔に書けますね。
XElement のコンストラクタの第2引数に、クエリ式を書けるってのがミソですね。
これで、「エレメントオブジェクトを生成し、ノードに追加」っていう面倒なコードを書かずに済みます。

ちなみに、Person配列は、以下のようなデータです。

static Person[] people = {
new Person { Name="徳川家康", Age=35, IsReal=true },
new Person { Name="織田信長", Age=44, IsReal=true },
new Person { Name="明智小五郎", Age=39, IsReal=false },
new Person { Name="石田三成", Age=18, IsReal=true },
new Person { Name="明智光秀", Age=52, IsReal=true },
new Person { Name="両津勘吉", Age=40, IsReal=false },
};


Linq to XML その11

  
Posted by gushwell at 20:12Comments(0)TrackBack(0)

2008年02月17日

LINQ to XML その11−配列へ変換

   このエントリーをはてなブックマークに追加 Clip to Evernote
LINQ to XML C#でXMLから配列へ変換

LINQ to XML その10」まで書いて、いちおう終わりのつもりだったのだけど、まだ書くべきことが残っていたので、その11ということで記事をアップします。

LINQ to XMLって、Element("Hoge") とか、データを指定するのにいちいち文字列を指定しなくてはいけないので、LINQ to Objectと比べて面倒です。
だったら、配列にしてしまったほうが扱いやすいのでは? ということで、XMLのデータを配列に変換するC#のコードです。

 XDocument xdoc = XDocument.Load("people.xml");
var q = from x in xdoc.Root.Elements()
select new Person {
Name = (string)x.Element("Name"),
Age = (int)x.Element("Age"),
IsReal = (bool?)x.Attribute("IsReal") ?? true
};
Person[] ps = q.ToArray();
foreach (var p in ps) {
Console.WriteLine("{0} {1} {2}", p.Name, p.Age, p.IsReal);

}

たったこれだけで出来るってすごくないですか?

入力するXMLファイルの中身は、「LINQ to XML その10」を見て下さい。  
Posted by gushwell at 22:49Comments(4)TrackBack(0)

C#プログラミングレッスン・バックナンバー

   このエントリーをはてなブックマークに追加 Clip to Evernote
Gushwell's C# Programing Page --「窓際プログラマーの独り言」別館で、メールマガジン『C#プログラミングレッスン』のバックナンバーを公開していますが、「C#入門編」、「オブジェクト指向編」の誤字、脱字等を修正し、アップしなおしました。

ご指摘くださったいしだ様ありがとうございました。
残りの分も時間をみつけ修正予定です。
  
Posted by gushwell at 16:59Comments(3)TrackBack(0)

2008年02月14日

LINQ to SQL:エンティティクラスのDelete, Insert, Updateプロパティ

   このエントリーをはてなブックマークに追加 Clip to Evernote
Visual Studio 2008のLINQ to SQLのO/Rデザイナー上に表示されるエンティティクラスには、Delete, Insert, Updateというプロパティがあるのですが、グレーアウトされている場合と、されていない場合があります。
この違いはいったい何なのだろう?
馬鹿な僕はこれが分からず、かなり長い間悩みました。

分かってみれば何のことはなかったです。
これらのプロパティには、ストアドプロシージャに対応するメソッドを指定するので、O/Rデザイナー画面に、ストアドプロシージャが登録されていれば、グレーアウトが解除されます。

つい最近、SQL Server 2005 Express Edition with Advanced Services SP2をインストールしたので、SQL Server 側に問題があるのかと思ってしまい、まったく関係ないところを一生懸命調べていたのでした (T T);

  
Posted by gushwell at 21:57Comments(0)TrackBack(0)

2008年02月13日

SQL Server のユーザー インスタンスを生成できませんでした

   このエントリーをはてなブックマークに追加 Clip to Evernote
Visual Studio 2008 で、アタッチデータベースを利用しようとし、 [データ]-[新しいデータソースの追加]でMDFファイルを指定すると、

----
ユーザー インスタンスのプロセスを起動中のエラーにより、SQL Server のユーザー インスタンスを生成できませんでした。接続は閉じられます。
----

というメッセージが出るようになってしまった。
前は出なかったと思ったんだけど...

いくつかのサイトにも載っていますが、とりあえずの解決策。
--------------
[接続のプロパティ]ダイアログで、[詳細設定]ボタンを押し、 [詳細プロパティ]ダイアログで、"User Instance" プロパティを Falseに設定する。
--------------

これでOK.

でも、なんで駄目になったんだろうか? 謎です。
  
Posted by gushwell at 20:21Comments(0)TrackBack(0)

2008年02月10日

LINQってやっぱりすごい

   このエントリーをはてなブックマークに追加 Clip to Evernote
C#でLINQの動きを確かめるために、以下のようなコードを作ってみました。

static class Program {
static void Main(string[] args) {
var nums = Enumerable.Range(1, 10);
var q = from n in nums
where n % 3 == 0
select n * 2;
foreach (var n in q)
Console.WriteLine(n);
}

public static IEnumerable<TSource> Where<TSource>(
          this IEnumerable<TSource> source,
Func<TSource, bool> predicate) {
foreach (var x in source) {
if (predicate(x))
yield return x;
}
}

public static IEnumerable<TResult> Select<TSource, TResult>(
          this IEnumerable<TSource> source,
Func<TSource, TResult> selector) {
foreach (var x in source) {
yield return selector(x);
}
}
}


独自の拡張メソッドを書くことで、クエリ式で呼び出されるメソッドを標準のものから、独自のものへ置き換えることが可能です。

上記コードからら分かるように、(そして、多くの方が指摘しているように)、LINQ to Objectの中身は列挙処理となってます。
たぶん、標準のWhere や Selectメソッドも同様の実装になっていると思われます。

で、実際にステップ実行してみたら、僕の予想とは違った動きをしました。
Whereのループが終わってから、Selectのループが動くと思ったのですが、そうはなりませんでした。
これには、最初とても驚きました。

なるほど、そういうことだったのか。すごいな〜。
僕は、素直にLINQってすごいなーと感心してしまいます...  
Posted by gushwell at 22:05Comments(0)TrackBack(0)