热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:C#按值复制数组分享

C#按值复制数组我有一个类型化的数组MyType[]types;我想制作这个数组的独立副本。我试过这个MyType[]types2newMyType[types.Length];t

C#按值复制数组

我有一个类型化的数组MyType[] types; 我想制作这个数组的独立副本。 我试过这个

 MyType[] types2 = new MyType[types.Length] ; types2 = types ; 

但这会创建对第一个的引用。 然后我试过了

 Array.Copy( types , types2 , types.Length ) ; 

但我有同样的问题:更改第一个数组中的值也会更改副本中的值。

如何创建Array,IList或IEnumerable的完全独立或深层副本?

在MyType上实现克隆方法,使用受保护的方法MemberwiseClone(执行浅拷贝)或使用深度克隆技术。 您可以让它实现ICloneable然后编写几个扩展方法来克隆相应的集合。

 interface ICloneable { T Clone(); } public static class Extensions { public static T[] Clone(this T[] array) where T : ICloneable { var newArray = new T[array.Length]; for (var i = 0; i  Clone(this IEnumerable items) where T : ICloneable { foreach (var item in items) yield return item.Clone(); } } 

您必须执行此操作,因为在使用Array.Copy时创建新数组时,它会复制引用,而不是引用的对象。 每种类型都负责复制自己。

基于第一篇文章,他所需要的只是“数组的独立副本”。 对shallowCopy数组本身的更改不会出现在types数组中(意思是元素赋值,这实际上是他在上面展示的内容,尽管说“深拷贝”)。 如果这符合您的需求,它将具有最佳性能。

 MyType[] shallowCopy = (MyType[])types.Clone(); 

他还提到了一个“深层复制”,它对于不是基元的递归值类型聚合的可变类型会有所不同。 如果MyType实现ICloneable ,这适用于深层复制:

 MyType[] deepCopy = (MyType[])Array.ConvertAll(element => (MyType)element.Clone()); 

对于不耐烦:

 newarray = new List(oldarray).ToArray(); 

如果您的类型是可序列化的,则可以使用序列化技术获取数组的副本(包括项目的深层副本):

 private static object GetCopy(object input) { using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, input); stream.Position = 0; return formatter.Deserialize(stream); } } 

要使用它:

 MyType[] items = new MyType[2]; // populate the items in the array MyType[] copies = (MyType[])GetCopy(items); 

我想做同样的事情:按照排序的方式为数组制作一个数组副本,这样我以后可以用原始源数组重新初始化另一个临时数组。 在研究了这个之后,我发现这不可能这么简单。 所以,我做了一个解决方法。 我将在下面使用我自己的代码:

 string[] planetNames = new string[] { "earth", "venus", "mars" }; string[] tempNames = new string[planetNames.Length]; for (int i = 0; i  

planetNames是我的源数组。 tempNames是我稍后将独立于planetNames排序的数组。 我测试了这个,当我对tempNames进行排序时,这个代码并没有对planetNames进行排序, 这正是我试图实现的。

如果要创建仅包含旧数组中对象引用的数组的副本(或者如果您有值类型对象的数组),最简单的解决方案是

 var newArray = oldArray.ToArray() 

如果你想要深层复制,你应该有一个复制你的类型的单个对象的方法(例如public MyType Copy(MyType obj) )。 然后解决方案看起来像

 var newArray = oldArray.Select(x => Copy(x)).ToArray() 

我发现如果你只是想要一个简单的char数组副本,你可以使用char来欺骗C#按值进行复制:

 char[] newchararray = new char[desiredchararray.Length]; for (int k = 0; k  

似乎为我工作,但如果有人不同意请告诉我:)

上述就是C#学习教程:C#按值复制数组分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---编程笔记


推荐阅读
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ... [详细]
  • 本文提供了使用Java实现Bellman-Ford算法解决POJ 3259问题的代码示例,详细解释了如何通过该算法检测负权环来判断时间旅行的可能性。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • C# LiNQ 查询 join连接
    C# LiNQ 查询 join连接 ... [详细]
  • Ihaveastringwithquotesaroundthepathasfollows:我在路径周围有一个带引号的字符串,如下所示:C:\ProgramFiles(x ... [详细]
  • 在软件开发过程中,MD5加密是一种常见的数据保护手段。本文将详细介绍如何在C#中使用两种不同的方式来实现MD5加密:字符串加密和流加密。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
author-avatar
Jacky麦麦9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有