.NET クラスライブラリ探訪-038 (System.Tuple)(タプル, 組オブジェクト, 4.0から追加されたクラス) - いろいろ備忘録日記
個人的には以前 今更 Func デリゲートや Action デリゲートについて一言 に書いた理屈と同様に、Tuple も無闇には使わずクラス内部のみといった限定的な利用に留めておくのが良いと考えていますが、Tuple の活用シーンは結構あるのではないかと思います。
Tuple は配列と少し似ていますが、次のような違いがあります。
- 長さ毎に型が用意されている
- 各要素は厳密に型付けされる
- 各要素は読み取り専用
- Tuple の Equals メソッドは各要素の等値性を比較する
- Tuple の GetHashCode メソッドは各要素を元にハッシュコードを導出する
Tuple は配列やコレクションと違って、同一性ではなく等値性で区別されます。これにより、Tuple を Dictionary の複合キーとして使用することができます。
private Dictionary<Tuple<int, int>, string> _dict;
public string GetValue(int key1, int key2)
{
return this._dict[Tuple.Create(key1, key2)];
}
また、自作クラス/構造体の Equals メソッド及び GetHashCode メソッドをオーバーライドする時、全てのフィールドをセットした Tuple に処理を委譲することで実装を容易にすることができます。
public sealed class Class1
{
public Class1(int arg1, string arg2)
{
this._field1 = arg1;
this._field2 = arg2;
}
private readonly int _field1;
private readonly string _field2;
public override bool Equals(object other)
{
var otherAsClass1 = other as Class1;
if (otherAsClass1 == null)
{
return false;
}
var thisFieldTuple = this.CreateFieldTuple();
var otherFieldTuple = otherAsClass1.CreateFieldTuple();
return thisFieldTuple.Equals(otherFieldTuple);
}
public override int GetHashCode()
{
var fieldTuple = this.CreateFieldTuple();
return fieldTuple.GetHashCode();
}
private Tuple<int, string> CreateFieldTuple()
{
return Tuple.Create(this._field1, this._field2);
}
}
ということで、Tuple は使い方次第でかなり重宝するかもしれません。