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は美人。ですです。

Profile

Yoshifumi Kawai

Cysharp, Inc
CEO/CTO

Microsoft MVP for Developer Technologies(C#)
April 2011
|
July 2023

Twitter:@neuecc GitHub:neuecc

Archive