我真的不确定如何标题。
我想要实现的是IEnumerable<T>
的{{1}}深度克隆系统。
我已经编写了一个尚未经过测试的方法,我认为该方法应该可行:
T:ICloneable
然而,这会返回一个 public static IEnumerable<T> DeepClone<T>(this IEnumerable<T> source) where T:ICloneable
{
return source.Select(s => (T) s.Clone());
}
(正如人们所期望的那样),我很好奇是否可以(不会导致不可接受的开销)返回IEnumerable<T>
的基本类型代替。
例如,运行IEnumerable<T>
会返回一个新的克隆List<int>.DeepClone()
,正在运行的List<int>
会返回一个新的,克隆的int[].DeepClone()
。
我知道在调用此方法后我可以很容易地投出int[]
,但我希望能够避免这种情况。
还可以选择创建一整套重载,每个IEnumerable
一个,但如果可以,我可以避免这种情况。
答案 0 :(得分:1)
您需要为要支持的具体类型(List,数组等)构建显式方法。
一个例子:
public static List<T> DeepClone<T>(this List<T> source) where T : ICloneable
{
return source.Select(s => (T)s.Clone()).ToList();
}
或者,使用如下方法:
public static IEnumerable<T> DeepClone<T>(this IEnumerable<T> source) where T : ICloneable
{
var result = source.Select(s => (T)s.Clone());
if (source is List<T>)
{
return result.ToList();
}
return result;
}