mic*_*ckG 3 c# dictionary copy
我有一个名为 baseDictionary 的字典。键是一个字符串,值是名为 myData 的类的属性。具体来说,这些属性是:“年龄”(作为 int)、“国籍”(作为字符串)和“收入”(作为 double)。
因此,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;
}
Run Code Online (Sandbox Code Playgroud)
问题是我不明白应该如何修改它以使其与我的字典一起使用。例如我尝试过:
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;
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误并且它不起作用。
错误 3 'Project2.myData 不包含 'Clone' 的定义,并且找不到接受类型 'Project2.myData 的第一个参数的扩展方法 'Clone'(您是否缺少 using 指令或程序集引用?)
我该如何解决这个问题?
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
};
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以重写/重载该方法以采用克隆方法而不是要求接口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;
}
Run Code Online (Sandbox Code Playgroud)
然后,您使用创建项目副本的函数调用该方法:
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
};
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6557 次 |
| 最近记录: |