C# 增加(1); } /////// Console.WriteLine(“\n每个list2元素中的int为:\n”); /////// foreach(列表2中的int i) { WriteLine(“list2元素:{0}”,i); } ///////在这里输入代码 for(int i=0;i
对对象进行深度序列化的一种方法是使用。以下扩展方法允许序列化任何任意对象的列表,但可以跳过实体框架导航属性,因为这些属性可能导致循环依赖关系和不需要的数据获取 方法C# 增加(1); } /////// Console.WriteLine(“\n每个list2元素中的int为:\n”); /////// foreach(列表2中的int i) { WriteLine(“list2元素:{0}”,i); } ///////在这里输入代码 for(int i=0;i,c#,deep-copy,C#,Deep Copy,对对象进行深度序列化的一种方法是使用。以下扩展方法允许序列化任何任意对象的列表,但可以跳过实体框架导航属性,因为这些属性可能导致循环依赖关系和不需要的数据获取 方法 public static List<T> DeepClone<T>(this IList<T> list, bool ignoreVirtualProps = false) { JsonSerializerSettings settings = new JsonSerializerSet
public static List<T> DeepClone<T>(this IList<T> list, bool ignoreVirtualProps = false)
{
JsonSerializerSettings settings = new JsonSerializerSettings();
if (ignoreVirtualProps)
{
settings.ContractResolver = new IgnoreNavigationPropsResolver();
settings.PreserveReferencesHandling = PreserveReferencesHandling.None;
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
settings.Formatting = Formatting.Indented;
}
var serialized = JsonConvert.SerializeObject(list, settings);
return JsonConvert.DeserializeObject<List<T>>(serialized);
}
默认情况下,JSON.NET仅序列化公共属性。如果还必须克隆私有属性,则可以使用
此方法允许对.双向飞碟进行编辑,但不知道答案?(8-O也许我遗漏了什么,但什么是“深度复制”关于
列表
?这是一个数字列表,它不像按钮类列表或有可能需要复制的成员的列表?我猜他的意思是他想对每个数据
对象进行深度复制,这意味着他需要复制列表,而不仅仅是复制引用。是的,很抱歉让人困惑。我有没有办法只深度复制列表对象的集合集?谢谢。Data.TraceData.GetRange()
创建指定子集的副本?这是一个选项吗?(在这里,GetRange
创建浅副本并不重要,因为双精度是值类型。)iClonable就像一个皮疹,在你意识到它无处不在之前就开始抓挠。应该注意的是,item.Clone()
不能保证深度复制,而.MemberwiseClone()
方法创建内部成员的浅层副本。请参阅msdn:@Brad,@Juliet:这就是我之所以称其为脏的原因。+1:不可变是唯一的方法:)如果用户不需要对列表进行索引访问,那么简单的不可变堆栈就足够了。大多数情况下,如果可以的话,我建议手工实现深度拷贝,因为序列化的速度并不十分快。然而,我实际上在过去对大量可变数据树使用过这种风格,并且它在实际使用中效果很好。@Juliet,谢谢,我只是为已经发布的解决方案提供了一种替代方案。几乎完美无缺。但就像我的例子一样,在mscorlib或当前程序集之外有对象数组,您需要使用elementType=Type.GetType(Type.AssemblyQualifiedName.Replace(“[]”,string.Empty))代码>服务堆栈使用GPL。您可能希望使用非原语的对象集合来使用Json.NetTry。那么你的例子就行不通了。编辑:现在我看到你甚至没有用列表1填充列表2!这与问题无关。。
public static IEnumerable<T> Clone<T>(this IEnumerable<T> collection) where T : ICloneable
{
return collection.Select(item => (T)item.Clone());
}
var list = new List<Data> { new Data { Comment = "comment", TraceData = new List { 1, 2, 3 } };
var newList = list.Clone();
var toPlot = list.Where(d => d.ShouldBePlotted());
public class Program
{
[Serializable]
public class Test
{
public int Id { get; set; }
public Test()
{
}
}
public static void Main()
{
//create a list of 10 Test objects with Id's 0-10
List<Test> firstList = Enumerable.Range(0,10).Select( x => new Test { Id = x } ).ToList();
using (var stream = new System.IO.MemoryStream())
{
var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
binaryFormatter.Serialize(stream, firstList); //serialize to stream
stream.Position = 0;
//deserialize from stream.
List<Test> secondList = binaryFormatter.Deserialize(stream) as List<Test>;
}
Console.ReadKey();
}
}
public class Data
{
public string Comment { get; set; }
public List<double> TraceData { get; set; }
public Data DeepCopy()
{
return new Data
{
Comment = this.Comment,
TraceData = this.TraceData != null
? new List<double>(this.TraceData)
: null;
}
}
}
var pointsInRange = dataPoints
.Select(x => x.DeepCopy())
.GetRange(start, length);
public static object DeepCopy(object obj)
{
if (obj == null)
return null;
Type type = obj.GetType();
if (type.IsValueType || type == typeof(string))
{
return obj;
}
else if (type.IsArray)
{
Type elementType = Type.GetType(
type.FullName.Replace("[]", string.Empty));
var array = obj as Array;
Array copied = Array.CreateInstance(elementType, array.Length);
for (int i = 0; i < array.Length; i++)
{
copied.SetValue(DeepCopy(array.GetValue(i)), i);
}
return Convert.ChangeType(copied, obj.GetType());
}
else if (type.IsClass)
{
object toret = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = type.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields)
{
object fieldValue = field.GetValue(obj);
if (fieldValue == null)
continue;
field.SetValue(toret, DeepCopy(fieldValue));
}
return toret;
}
else
throw new ArgumentException("Unknown type");
}
MyClass mc = new MyClass();
string json = mc.ToJson();
MyClass mcCloned = json.FromJson<MyClass>();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeepListCopy_testingSome
{
class Program
{
static void Main(string[] args)
{
List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
//populate list1
for (int i = 0; i < 20; i++)
{
list1.Add(1);
}
///////
Console.WriteLine("\n int in each list1 element is:\n");
///////
foreach (int i in list1)
{
Console.WriteLine(" list1 elements: {0}", i);
list2.Add(1);
}
///////
Console.WriteLine("\n int in each list2 element is:\n");
///////
foreach (int i in list2)
{
Console.WriteLine(" list2 elements: {0}", i);
}
///////enter code here
for (int i = 0; i < list2.Count; i++)
{
list2[i] = 2;
}
///////
Console.WriteLine("\n Printing list1 and list2 respectively to show\n"
+ " there is two independent lists,i e, two differens"
+ "\n memory locations after modifying list2\n\n");
foreach (int i in list1)
{
Console.WriteLine(" Printing list1 elements: {0}", i);
}
///////
Console.WriteLine("\n\n");
///////
foreach (int i in list2)
{
Console.WriteLine(" Printing list2 elements: {0}", i);
}
Console.ReadKey();
}//end of Static void Main
}//end of class
}
public static List<T> DeepClone<T>(this IList<T> list, bool ignoreVirtualProps = false)
{
JsonSerializerSettings settings = new JsonSerializerSettings();
if (ignoreVirtualProps)
{
settings.ContractResolver = new IgnoreNavigationPropsResolver();
settings.PreserveReferencesHandling = PreserveReferencesHandling.None;
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
settings.Formatting = Formatting.Indented;
}
var serialized = JsonConvert.SerializeObject(list, settings);
return JsonConvert.DeserializeObject<List<T>>(serialized);
}
var clonedList = list.DeepClone();