C# 中的数组(array)

简介:

原文 C# 中的数组(array)

 

特性

数组是一个无序的元素序列。数组元素存储在一个连续性的内存块中,并可使用一个整数索引来访问。

C# 声明数组变量时,数组的大小不是声明的一部分。这点与C/C++有些区别。

1
int [] dogs;  // 声明数组 // 声明时不需要指定数组的大小 

 只有在实际创建数组实例的时候,才需要指定数组的大小。创建数组实例时编译器默认将数组元素初始化为0,null,false(依元素类型不同)。

1
pins =  new  int [4];   // 只有在实际创建数组实例的时候,才需要指定数组的大小。 

 以上两个语句运行后结果如下:

 数组实例的大小不一定是常量,它可以在运行时计算

    int size = int.Parse(Console.ReadLine());  
    int[] pins = new int[size];  

 

某些情况下,数组大小可能为 0,这个设计是有意义的。大小为 0 的数组不是一个 null(空)数组。除了基本数据类型,数组元素还可以是结构、枚举或者类。

大括号中的值不一定是常量,它们可以是在运行时计算的值。

1
2
3
4
5
Random r =  new  Random(); 
int [] pins =  new  int [4]{r.Next()%10, 
                         r.Next()%10, 
                         r.Next()%10, 
                         r.Next()%10}; 

 

初始化

初始化数组变量。大括号中的值的数量必须和要创建的数组实例的大小完全匹配!

 

1
2
3
int [] pins =  new  int [3] { 1, 2, 3, 4 };      // 编译时错误 
int [] pins =  new  int [4] { 1, 2, 3 };         // 编译时错误 
int [] pins =  new  int [4] { 1, 2, 3, 4 };      // 正确 

 

 初始化一个数组变量时,实际上可省略 new 表达式和数组的大小,编译器将根据初始值的数量来计算大小。

1
int [] pins = { 1, 2, 3, 4 };     // 正确 

创建一个由结构构成的数组时,为了初始化数组的每个结构,可以调用结构构造器。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
struct  Time 
     private  int  hours, minutes, seconds; 
   
     public  Time( int  hh,  int  mm) 
    
         hours = hh; 
         minutes = mm; 
         seconds = 0; 
    
   
Time[] schedule = { new  Time(12, 30),  new  Time(5, 30)};   // 调用自定义的结构构造器 

 

隐式类型的数组创建

匿名类(anonymous class)是一个没有名字的类,只能包含 public 字段,字段必须全部初始化不可以是 static 字段,而且不能在其中指定方法

可以创建隐式类型的数组。如果在声明数组的时候指定了一个初始值列表,就可以让 C# 编译器自己推断数组中的元素的类型。

 

1
2
3
4
5
6
7
8
9
10
11
var  names =  new []{ "Steven" "Lily" "Tom" "Miley" };  // C# 推断 names 是一个 string 类型 
Console.WriteLine(names[0]); 
Console.WriteLine(names[3]); 
   
// 隐式类型转换的数组尤其适用于匿名类型 
var  people =  new []{ new  {Name =  "Steven" , Age = 27},      
                     new  {Name =  "Lily" , Age = 25}, 
                     new  {Name =  "Tom" , Age = 8}, 
                     new  {Name =  "Miley" , Age = 6}}; 
// 数组中的每个元素都是匿名类型 
// 并且每个元素都必须指定相同的匿名类型 

 

 访问及遍历数组有如下方法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using  System; 
using  System.Collections.Generic; 
using  System.Linq; 
using  System.Text; 
   
namespace  arrayType 
     class  Program 
    
         static  void  Main( string [] args) 
        
             string [] names =  new []{ "Steven" "Lily" "Tom" "Miley" }; 
             Console.WriteLine(names[0]); 
             Console.WriteLine(names[3]); 
   
             Console.WriteLine(); 
             Console.WriteLine( "用 for 遍历字符串数组" ); 
             for  ( int  i = 0; i < names.Length; i++)   
                     // length 是属性而不是方法,不要加 '()' 
            
                 Console.WriteLine(names[i]); 
            
   
             Console.WriteLine(); 
             Console.WriteLine( "用 foreach 遍历 string 数组" );  
                     // foreach 是遍历数组的首选方式 
             foreach ( string  name  in  names) 
            
                 Console.WriteLine(name); 
            
   
             var  people =  new []{ new  {Name =  "Steven" , Age = 27}, 
                                new  {Name =  "Lily" , Age = 25}, 
                                new  {Name =  "Tom" , Age = 8}, 
                                new  {Name =  "Miley" , Age = 6}}; 
   
             Console.WriteLine(); 
             Console.WriteLine( "用 foreach 遍历 var 数组" ); 
             foreach ( var  person  in  people) 
            
                 Console.WriteLine(person);  
            
   
             Console.WriteLine(); 
             Console.WriteLine( "用 foreach 遍历 var 数组" ); 
             foreach  ( var  person  in  people) 
            
                Console.WriteLine( "Name: {0}, Age: {1}" , person.Name, person.Age); 
            
   
             Console.WriteLine(); 
        
    

 

 

复制数组

复制数组有如下方法,但只有最后一种是真正的复制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int [] pins = { 1, 2, 3, 4 }; 
int [] copy =  new  int [pins.Length]; 
pins.CopyTo(copy, 0);    // 将数组 pins 的内容复制到数组 copy 
// CopyTo 是浅拷贝,从指定位置开始复制,复制后两个数组都引用同一组对象 
   
int [] pins = { 1, 2, 3, 4 }; 
int [] copy =  new  int [pins.Length]; 
Array.Copy(pins, copy, copy.Length);     // Copy 方法是浅拷贝 
   
int [] pins = { 1, 2, 3, 4 }; 
int [] copy = ( int [])pins.Clone();        // Clone 方法是浅拷贝 
     // Clone 放回的是一个 object,所以必须进行类型准换 
   
int [] pins = { 1, 2, 3, 4 }; 
int [] copy =  new  int [pins.Length]; 
for  ( int  i = 0; i < copy.Length; i++) 
     copy[i] = pins[i];       // 深拷贝,也就是产生了两个数组 

 

维数

数组的维数是没有限制的,可以创建多维数组。

1
2
3
string [,] stars =  new  string [6,8];   // 创建二维数组,6 行 8 列 
stars[2, 6] =  "Mars" ;    // 将单元格(2, 6)的元素设为 Mars 
     // 使用多维数组时,要准备好捕捉并处理 OutOfMemoryException 

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。





    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5948079.html ,如需转载请自行联系原作者

相关文章
|
3月前
|
测试技术 PHP 开发者
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
|
7月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
432 1
Java 中数组Array和列表List的转换
|
7月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
208 67
|
7月前
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
Web App开发 存储 前端开发
别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
这类问题的重点在于能不能突破基础思路,突破基础思路是从程序员入门变成中级甚至高级的第一步,如果所有需求都通过最基础的业务逻辑来做,是得不到成长的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
329 5
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
366 2

热门文章

最新文章

  • 1
    Java 中数组Array和列表List的转换
    432
  • 2
    JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
    462
  • 3
    通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)
    1100
  • 4
    通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
    304
  • 5
    通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
    186
  • 6
    多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解
    120
  • 7
    别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
    121
  • 8
    Array.forEach实战详解:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
    103
  • 9
    深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
    321
  • 10
    JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
    602