我有一个名为 ValueFrequency 的结构,它作为一个结构开始它的生命,你(出于统计原因)可以存储一个(双)值和一个(int)频率(告诉这个值在一组数据中出现的次数。例如,如果你有一个列表/数组的值:1,1,1,2,2,3,4,4,4,4,4 它可以存储为 ValueFrequency 的列表/数组,而不是:(1,3) ,(2,2),(3,1),(4,5)。
无论如何,我发现我可以使用泛型而不是硬编码我的 scruct 来使用 double,这样我就可以将它与外部数据类型一起使用(例如,当使用它来存储来自二维数据集的数据时)。
结构的简化版本:
public struct ValueFrequency<T> : IComparable, ICloneable where T : IComparable
{
public T value;
public int Frequency;
}
我的问题是我想将此结构与支持 ICloneable 和 ValueTypes(如 double)的结构/类一起使用。我将如何编写一个复制构造函数(从另一个 ValueFrequncy 复制其字段),如果结构/类支持 IClonable,它将简单地分配相同的值(如果类型是 ValueType)或克隆:
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 以执行克隆)。