1

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 に型キャスト) をテストすることです。

4

3 に答える 3

0

あなた (Yacoub Massad と D Stanley) の両方のおかげで、私はあなたの両方のソリューションを実装することになりました。(copy)Constructor (D Stanley の提案を実装する) の次の実装を決定しました。

public ValueFrequency(ValueFrequency<T> valueFrequency)
{
    if (valueFrequency.Value is ICloneable)
        Value = (T)((ICloneable)valueFrequency.Value).Clone();
    else
        Value = valueFrequency.Value;
    _frequency = valueFrequency.Frequency;
}

この構造体の別のメソッドは、ValueFrequency の IEnumerable (値 (T) と Frequency (int) を保持) を取得し、それを値のリスト (T) に「アンパック」できます。頻度 (このメソッドは Yacoub Massad の提案を実装しています):

public static List<T> ListOfValueFrequencyToList(IEnumerable<ValueFrequency<T>> valueFrequencyList)
{
    bool isCloneable = typeof(ICloneable).IsAssignableFrom(typeof(T));
    List<T> result = new List<T>();
    foreach (ValueFrequency<T> vf in valueFrequencyList)
    {
        for (int i = 0; i < vf.Frequency; i++)
        {
            if (isCloneable)
                result.Add((T)((ICloneable)vf.Value).Clone());
            else
                result.Add(vf.Value);
        }
    }
    return result;
}
于 2016-06-09T06:25:55.527 に答える