我有一个名为baseDictionary的词典。键是一个字符串,值是名为myData的类的属性。在某些方面,属性是:"年龄" (如int),"国籍" (作为字符串)和"收入" (双倍)。
因此,baseDictionary有一些字符串作为键,每个键都有一系列与特定人相关的属性。 我想在某些时候制作这本词典的深层副本,这样我就可以使用这个新副本而无需修改原始词典的内容。 我在stackoverflow中找到了一个答案,其中建议使用以下代码来执行此深层复制:
public static Dictionary<TKey, TValue>
CloneDictionaryCloningValues<TKey, TValue>(
Dictionary<TKey, TValue> original) where TValue : ICloneable
{
Dictionary<TKey, TValue> ret = new Dictionary<TKey, TValue>(
original.Count, original.Comparer);
foreach (KeyValuePair<TKey, TValue> entry in original)
{
ret.Add(entry.Key, (TValue) entry.Value.Clone());
}
return ret;
}
问题是我无法理解我应该如何修改它以使其适用于我的字典。例如,我试过:
public static Dictionary<string, myData> CloneDictionaryCloningValues<TKey, TValue>
(Dictionary<string, myData> original) where TValue : ICloneable
{
Dictionary<string, myData> ret = new Dictionary<string, myData>(original.Count,
original.Comparer);
foreach (KeyValuePair<string, myData> entry in original)
{
ret.Add(entry.Key, (myData)entry.Value.Clone());
}
return ret;
}
但是我收到以下错误并且它不起作用。
错误3&#39; Project2.myData不包含&#39;克隆&#39;的定义没有扩展方法&#39;克隆&#39;接受第一个类型的参数 &#39;可以找到Project2.myDat(你是否错过了使用指令或 汇编参考?)
我该如何解决这个问题?
答案 0 :(得分:3)
如果让CloneDictionaryCloningValues
类实现myData
接口,则根本不需要更改ICloneable
方法:
public class myData : ICloneable {
// your code
public object Clone() {
// whatever you need to create a copy, for example:
return new myData() {
age = this.age,
nationality = this.nationality,
income = this.income
};
}
}
您还可以重写/重载方法以采用克隆方法,而不是要求IClonable
接口:
public static Dictionary<TKey, TValue> CloneDictionaryCloningValues<TKey, TValue>
(Dictionary<TKey, TValue> original, Func<TValue, TValue> clone)
{
Dictionary<TKey, TValue> ret = new Dictionary<TKey, TValue>(original.Count, original.Comparer);
foreach (KeyValuePair<TKey, TValue> entry in original) {
ret.Add(entry.Key, clone(Value));
}
return ret;
}
然后使用创建项目副本的函数调用该方法:
myCopy = CloneDictionaryCloningValues(myOriginal, item => {
// whatever you need to create a copy, for example:
return new myData() {
age = item.age,
nationality = item.nationality,
income = item.income
};
});
答案 1 :(得分:1)
您不应该修改CloneDictionaryCloningValues()
例程,只需按原样使用它。因为它是通用的,它将与您的键(字符串)和值类(mydata)一起使用。
<强> BUT:强>
要使此例程正常工作,您的类必须具有公共Clone()
例程,即实现ICloneable
接口。
答案 2 :(得分:1)
正如函数指定:您需要在类型myData
另外:
myData
类重命名为更具描述性的类,并以大写字符开头