Linqは美人
- 2009-09-25
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は美人。ですです。