中身はよく分からないけれどすごい。何がすごいのかっていうとIComparableを実装している。クラスだとこうはいかない。
(new[] { Tuple.Create(1,2), Tuple.Create(2,1) }).OrderBy(x => x).ToArray(); // エラー出ない
(new[] { new {A=1, B=2}, new {A=2, B=1} }).OrderBy(x => x).ToArray(); // エラー "少なくとも 1 つのオブジェクトで IComparable を実装しなければなりません。"
これだけでもすごいのに、Tupleでは全部の型(T1,T2,…)がIComparableを実装していなくてもソートできる。つまりどういうことかというと、
(new[] { Tuple.Create(1,2,new Func<int>(() => 1)), Tuple.Create(2,1,new Func<int>(() => 1)) }).OrderBy(x => x).ToArray(); // エラー出ない
Func<int> 型を使ったのは、IComparableでない型がこれしか思い付かなかったからというだけなので、特に深い意味はありません。
ちなみに、どの型(T1,T2,…)もIComparableを実装していなかった場合は、ソートしようとするとエラーになる。
(new[] { Tuple.Create(new Func<int>(() => 1)), Tuple.Create(new Func<int>(() => 1)) }).OrderBy(x => x).ToArray(); // エラー "少なくとも 1 つのオブジェクトで IComparable を実装しなければなりません。"
何故なのかは分からないけれどすごい。わざわざIComparableの実装を書かなくて済む。横着できる。もしかしたら実はすごくないのかもしれないけどすごいような気がする。
結論:Tupleはすごい。