読者です 読者をやめる 読者になる 読者になる

久しぶりにC#を書いた

C# Linq

まず最初にやったこと。C# Mode for EmacsのページからC#Emacsモードのelをダウンロードし、emacsC#を書けるようにする。Visual StudioMonoDevelop?何それ?(MonoDevelopは文字化けはするものの、Macでもちゃんと起動して驚いた。)

http://mfgames.com/linux/csharp-mode

頑張ってC#の構文を思い出す。

use System;

public class Hello {
    public static void Main(String[] args) {
        Console.WriteLine("Hello World");
    }
}

とかって書いていた。usingではなくuse、string argsではなく String argsとか書いてしまうところがPerlJavaに毒されていますね。

今日はLinq to XMLを試してみたかっただけなので、次のようなコードを書いてみる。TwitterのPublic Timeline APIからXML形式でデータを取得し、locationにTokyoを含むテキストとユーザ名だけを出力する。

using System;
using System.Linq;
using System.Xml.Linq;

public class MyTwitter {
    public static void Main(string[] args) {
        var doc = XDocument.Load(@"http://twitter.com/statuses/public_timeline.xml");

        var statuses = from status in doc.Root.Descendants("status")
            let location = (string)status.Element("user").Element("location")
            where location.ToLower().Contains("tokyo")
            select new { Text = (string)status.Element("text"),
                UserName = (string)status.Element("user").Element("name") };
        
        foreach(var status in statuses) {
            Console.WriteLine("{0} - {1}", status.Text, status.UserName);
        }
    }
}

XDocumentやXElementは子要素をいちいちElementやDescendant, Descendantsで指定しなくてはいけないのかどうかがよく分からない。XPathで指定できないのだろうか?

あと、Mac上でMonoの1.9を使ってコンパイルしているのだが、普通にコンパイルするとSystem.Xml.Linqが見つからないというエラーが出て結構困った。

$ gmcs -lib:/Library/Frameworks/Mono.framework/Versions/1.9/lib/mono/gac/System.Xml.Linq/3.5.0.0__b77a5c561934e089 \
 -r:System.Xml.Linq mytwitter.cs

としてコンパイルしているけど、なんか違う気がするなぁ。


それはともかく、MonoでもC#3.0の構文が使えるのがすごい。


それにしても、C#とLINQはやっぱり美しい。


それにしても、Microsoft謹製の.NET FrameworkVisual Studioが動く環境が自宅にも欲しい。4年前のMacだと、この程度のコードでもコンパイルするのにストレスがたまる。