ValueFrequency と呼ばれる構造体があります。これは、(統計上の理由から) (double) 値と (int) 周波数 (一連のデータでこの値が何回発生したかを示す) を格納できる構造体としてその寿命を開始します。たとえば、if値を持つリスト/配列がありました: 1,1,1,2,2,3,4,4,4,4,4 代わりに ValueFrequency のリスト/配列として保存できます: (1,3) 、(2,2)、(3,1)、(4,5)。
とにかく、ダブルを使用するようにスクラクトをハードコーディングする代わりに、ジェネリックを使用できることがわかったので、他のデータ型で使用できます(たとえば、2次元データセットからデータを格納するためにポイントを使用する場合)。
構造体の簡略版:
public struct ValueFrequency<T> : IComparable, ICloneable where T : IComparable
{
public T value;
public int Frequency;
}
私の問題は、ICloneable と double のような ValueTypes をサポートする構造体/クラスの両方でこの構造体を使用したいということです。構造体/クラスが IClonable をサポートしている場合は、単純に同じ値を割り当てるか (型が ValueType の場合)、クローンを作成する (別の ValueFrequncy からフィールドをコピーする) コピー コンストラクターを作成するにはどうすればよいでしょうか。
public ValueFrequency(ValueFrequency<T> valueFrequency)
{
if (typeof(T).IsValueType)
this.Value = valueFrequency.Value;
else if (T is supporting IClonable) // pseudo-code ???
this.Value = (T)valueFrequency.Value.Clone();
else
throw new Exception("T must be ValueType or IClonable") ;
this.Frequency = valueFrequency.Frequency;
}
ご覧のとおり、私の問題は、T が IClonable であるかどうか、および実際のクローン作成 (クローン作成を実行するために T を IClonable に型キャスト) をテストすることです。