Linqは美人

public class Stamp
{
    public int Year { get; set; }
    public string Name { get; set; }
    public Stamp(int year, string name) { this.Year = year; this.Name = name; }
    public override string ToString() { return this.Year + ":" + this.Name; }
}
 
public class StampCollection : IEnumerable<Stamp>
{
    private Dictionary<string, Stamp> stamps = new Dictionary<string, Stamp>();
 
    public void Add(Stamp s) { stamps.Add(s.Name, s); }
    public void Add(int year, string name) { stamps.Add(name, new Stamp(year, name)); }
 
    // yield returnを通さなくてもそのままreturn可能
    public IEnumerator<Stamp> GetEnumerator()
    {
        return stamps.Values.OrderBy(s => s.Year).GetEnumerator();
    }
 
    // GetEnumeratorと名乗りながらGetEnumeratorじゃないのが少しアレですね
    public IEnumerable<Stamp> GetEnumerator2()
    {
        return stamps.Values.OrderByDescending(s => s.Year);
    }
 
    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}
 
// 利用時例
static void Main(string[] args)
{
    // コレクション初期化子は、複数引数時は更に{}で囲む
    var stamps = new StampCollection()
    {
        {1998, "hoge1"},
        {1999, "hoge2"},
        {2000, "hoge3"}
    };
 
    // GenericsにしておくとCast<T>を使わずLinqでコンボ出来る
    stamps.GetEnumerator2().Select(s => s.Name).ToList().ForEach(Console.WriteLine);
}

memo:C#の反復と例外 - ニート=>(vb=>..なんて無かった)=>ネトゲ屋のものを少し書き換えました。コレクション初期化子と、yield returnせずにそのまま投げ返すように変えただけですが。Linqは美人。ですです。

Comment (0)

Name
WebSite(option)
Comment

Trackback(0) | http://neue.cc/2009/09/25_204.html/trackback

Search/Archive

Category

Profile


Yoshifumi Kawai
Microsoft MVP for Developer Technologies(C#)

April 2011
|
July 2021

Twitter:@neuecc
GitHub:neuecc
ils@neue.cc