[.net 面向对象编程基础] (17) 数组与集合
[.net 面向对象编程基础] (17) 数组与集合
学习了前面的C#三大特性,及接口,抽象类这些相对抽象的东西以后,是不是有点很累的感觉。具体的东西总是容易理解,因此我们在介绍前面抽象概念的时候,总是举的是具体的实例以加深理解。
本节内容相当具体,学起来也相当轻松。
1.数组
1.1 什么是数组?
数组是一种数据结构,包含同一个类型的多个元素。
1.2数组的初始化
string[] mystringArray;
类型+方框号 数组名
1.3数组初始化
我们知道数组是引用类型,所以需要给他分配堆上的内存。
1.myIntArray = new int[3];
2.myIntArray = new int[] { 1, 2, 3 };
3.int[] myIntArray = { 1, 2, 3 }; //当使用这种方法对数组进行初始化时,只能在声明变量数组时使用,不能在声明数组之后使用。
1.4 数组的访问
数组在声明和初始化后,可以使用索引器进行访问,索引器总是以0开头,表示第一个元素。
//数组调用
string[] stringArray = new string[] { "aa", "bb", "cc" };
Console.WriteLine("stringValue=\"{0}\"", stringArray[]);
Console.ReadLine();
//运行结果为:
//stringValue="aa"
1.5数组类型
数组根据维度不同,分为矩阵数组(一维数组,二维数组,多维数组)和锯齿数组(也就是数组的数组),下面看一下他们的声明方式
//数组 声明
string[] stringArray = new string[] { "aa", "bb", "cc" };
//数组 访问
Console.WriteLine("一维数组第一个值为:{0}", stringArray[]);
//运行结果为:一维数组第一个值为:aa //二维数组 声明
string[,] stringArray2 = new string[,] { { "a1", "a2", "ac" }, { "b1", "b2", "b3" }, { "c1", "c2", "c3" } };
//二维数组访问
Console.WriteLine("二维数组的1维第1个值是:{0}", stringArray2[, ]);
//运行结果为:二维数组1维第1个值为:a1 //三维数组访问 声明
int[, ,] myIntArray3 = new int[,,] {
{ {,}, {,}, {,} },
{ {,}, {,}, {,} },
{ {,}, {,}, {,} },
{ {,}, {,}, {,} }
};
//三维数组访问 访问
Console.WriteLine("三维数组2维的2维的第2个值为:{0}", myIntArray3[,, ]);
//运行结果为:三维数组2维的2维的第2个值为:22 //锯齿数组(又称数组的数组)
int[][] myIntArray4 = new int[][];
myIntArray4[] = new int[] { , , };
myIntArray4[] = new int[] { , };
myIntArray4[] = new int[] { , , , };
Console.WriteLine("锯齿数组第3个数组的第2个值为:{0}", myIntArray4[][]);
//运行结果为:锯齿数组第3个数组的第2个值为:33
Console.ReadLine();
2.集合
2.1.什么时集合?
广义的角度理解集合,就是一组东西聚集在一起。而.NET的集合的定义为:在.NET Framework 中,提供了用于数据存储和检索的专用类,这些类统称集合。这些类提供对堆栈、队列、列表和哈希表的支持。大多数集合类实现相同的接口。
其中最常用的是System.Collections命名空间下的ArrayList,它是按需分配自动增加的实现IList接口的数组。它的默认初始容量为0,因此集合的索引从0开始。
2.2.数组和集合的区别:
在介绍集合前,先说一下集合和数组的区别,既然有了数组,为何C#还要设定一个集合呢?
区别如下:
数组有他的优点,就是在内存中连续存储,遍历比较方便,也可以很方便的修改元素。缺点就是需要指定数组变量大小,此外,两个元素间添加一个元素也比较麻烦。
而集合则不需要事先定义大号,可以根据需要自动分配大小。随意添加移除某一范围元素也比较方法。
2.3 示例:
还是以前面的动物家族为例,说明集合ArrayList的插入,添加,移除操作
/// <summary>
/// 动物类(父类 抽象类)
/// </summary>
abstract class Animal
{
/// <summary>
/// 名字
/// 说明:类和子类可访问
/// </summary>
protected string name; /// <summary>
/// 构造函数
/// </summary>
/// <param name="name"></param>
public Animal(string name)
{
this.name = name;
} private int shoutNum = ;
public int ShoutNum
{
get { return shoutNum; }
set { shoutNum = value; }
} /// <summary>
/// 名字(虚属性)
/// </summary>
public virtual string MyName
{
get { return this.name; }
} /// <summary>
/// 叫声,这个方法去掉虚方法,把循环写在这里
/// </summary>
public void Shout()
{
string result = "";
for (int i = ; i < ShoutNum; i++)
result += getShoutSound() + "!"; Console.WriteLine(MyName);
Console.WriteLine(result);
} /// <summary>
/// 创建一个叫声的虚方法,子类重写
/// </summary>
/// <returns></returns>
public virtual string getShoutSound()
{
return "";
}
}
/// <summary>
/// 狗(子类)
/// </summary>
class Dog : Animal
{
string myName;
public Dog(string name)
: base(name)
{
myName = name;
}
/// <summary>
/// 名字(重写父类属性)
/// </summary>
public override string MyName
{
get { return "我是:狗狗,我叫:" + this.name; }
}
/// <summary>
/// 叫(重写父类方法)
/// </summary>
public override string getShoutSound()
{
return "汪!";
}
} /// <summary>
/// 猫(子类)
/// </summary>
class Cat : Animal
{
string myName;
public Cat(string name)
: base(name)
{
myName = name;
}
/// <summary>
/// 名字(重写父类属性)
/// </summary>
public override string MyName
{
get { return "我是:猫咪,我叫:" + this.name; }
}
/// <summary>
/// 叫(重写父类方法)
/// </summary>
public override string getShoutSound()
{
return "喵!";
}
} /// <summary>
/// 羊(子类)
/// </summary>
class Sheep : Animal
{
string myName;
public Sheep(string name)
: base(name)
{
myName = name;
}
/// <summary>
/// 名字(重写父类属性)
/// </summary>
public override string MyName
{
get { return "我是:羊羊,我叫:" + this.name; }
}
/// <summary>
/// 叫(重写父类方法)
/// </summary>
public override string getShoutSound()
{
return "咩!";
}
}
调用及返回结果:增加、添加、移除实现示例如下:
//IList 添加、插入元素
IList animalList = new ArrayList();
Cat huaHua = new Cat("花花");
animalList.Insert(, new Dog("旺财"));//Insert是在指定的索引处插入元素
animalList.Add(new Cat("阿狸"));//Add是在集合最后面插入元素
animalList.Insert(animalList.Count, new Sheep("慢羊羊"));
animalList.Add(huaHua);
//增加四个元素后的返回结果如下
Console.WriteLine("增加四个元素后的返回结果:");
foreach (Animal animal in animalList)
{
animal.Shout();
} //移除元素
//旺财和阿狸退出队列
animalList.RemoveAt();
animalList.RemoveAt();//注意这里当移除一个元素后,后面的元素会排到第一位了,移除第二个元素不能是 animalList.RemoveAt(1);
animalList.Remove(huaHua);//Remove是指移除指定的元素,注意这里不能animalList.Remove(new Cat("花花"));这样写查找不到,因为new以后又是另一个实例了(另一只同名的猫而已) //移除元素后的返回结果如下:
Console.WriteLine("执行移除后的返回结果:");
foreach (Animal animal in animalList)
{
animal.Shout();
}
Console.ReadLine();
返回结果:
2.4集合ArrayList的缺点
集合ArrayList相比数组有这么多好处,但是他也是有很多缺点的
A.ArrayList并非类型安全
ArrayList不论什么类型都接受,实际是接受一个object类型。
比如如下操作:
ArrayList ar = new ArrayList();
ar.Add();
ar.Add("bbb");
我们使用foreach遍历的时候 foreach(int array in ar){}那么遇到”bbb”则程度报错,因此我们说他是非安全类型。
B.遍历ArrayList资源消耗大
因此类型的非安全,我们在使用ArrayList的时候,就意味着增加一个元素,就需要值类型转换为Object对象。遍历的时候,又需要将Object转为值类型。
就是装箱(boxing,指将值类型转换为引用类型)和拆箱(unboxing,指将引用类型转换为值类型)
由于装箱了拆箱频繁进行,需要大量计算,因此开销很大。如此说来还不如数组来的方便。我们只能说各有利弊,小伙伴们不要急,.net的设计者在2.0以后的版本中为我们解决了上述后顾之忧,那就是下一节要说的泛型。
3.要点:
A.数组是一种数据结构,包含有同类型的多个元素
B..集合是.net中提供数据存储和检索的专用类
C.ArrayList是按需分配自动增加的实现IList接口的数组
D.集合和数组各有优缺点,数组定义需要预先指定大小,而集合虽然不需要事先指定,但是存在类型安全和资源消耗过大的缺陷。
使用泛型可以解决上面的问题。
==============================================================================================
返回目录 <如果对你有帮助,记得点一下推荐哦,有不明白的地方或写的不对的地方,请多交流>
==============================================================================================
[.net 面向对象编程基础] (17) 数组与集合的更多相关文章
- [.net 面向对象编程基础] (1) 开篇
[.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...
- [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句
[.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...
- [.net 面向对象编程基础] (18) 泛型
[.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...
- [.net 面向对象编程基础] (19) LINQ基础
[.net 面向对象编程基础] (19) LINQ基础 上两节我们介绍了.net的数组.集合和泛型.我们说到,数组是从以前编程语言延伸过来的一种引用类型,采用事先定义长度分配存储区域的方式.而集合是 ...
- [.net 面向对象编程基础] (20) LINQ使用
[.net 面向对象编程基础] (20) LINQ使用 通过上节LINQ的基础知识的学习,我们可以开始使用LINQ来进行内存数据的查询了,我们上节说了LINQ的定义为:Language Integr ...
- [.net 面向对象编程基础] (21) 委托
[.net 面向对象编程基础] (20) 委托 上节在讲到LINQ的匿名方法中说到了委托,不过比较简单,没了解清楚没关系,这节中会详细说明委托. 1. 什么是委托? 学习委托,我想说,学会了就感觉简 ...
- C#面向对象编程基础-喜课堂笔记
**************[5][C#面向对象编程基础]第1讲:类与对象**************** *************2.1.1_类与对象的概念**** ...
- 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础
第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
随机推荐
- SortedDictionary
对一个Dictionary<TKey, TValue>进行键排序可以直接用SortedDictionary SortedDictionary<TKey, TValue> 泛型类 ...
- org.dom4j.DocumentException : 1 字节的 UTF-8 序列的字节 1 无效。 Nested exception: 1 字节的 UTF-8 序列的字节 1 无效。
org.dom4j.DocumentException : 1 字节的 UTF-8 序列的字节 1 无效. Nested exception: 1 字节的 UTF-8 序列的字节 1 无效. 网上查了 ...
- 友盟错误日志分析(转自:COCOACHINA shemy )
在做的项目中,用到了友盟的组件,在没有禁用错误日志上传之前,收集了一些错误日志. 有一些朋友看到了错误日志,却不知道怎么定位到程序的的代码中,实际上,这一步是非常的简单.友盟没有集成.dSYM文件 ...
- angular中的 ng-change
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- DOM基础
DOM(Document Object Model)即文档对象模型,针对HTML 和XML 文档的API(应用程序接口).DOM 描绘了一个层次化的节点树,运行开发人员添加.移除和修改页面的某一部分. ...
- JavaWeb 命名规则
命名规范命名规范命名规范命名规范 本规范主要针对java开发制定的规范项目命名项目命名项目命名项目命名 项目创建,名称所有字母均小写,组合方式为:com.company.projectName.com ...
- i love matlab
新手上路~话说图像修复熟么的真的很有意思~忽的想起NG讲的一个笑话:它让我赚了很多钱,买了车子,买了房子,so what's that? It's Matlab <( ̄3 ̄)> 前两天一直 ...
- Web Workers
在 Web Workers 中使用 postMessage 和 onmessage 首先,需要在客户端页面的 JavaScript 代码中 new 一个 Worker 实例出来,参数是需要在另一个线程 ...
- 企业搜索引擎开发之连接器connector(二十九)
在哪里调用监控器管理对象snapshotRepositoryMonitorManager的start方法及stop方法,然后又在哪里调用CheckpointAndChangeQueue对象的resum ...
- maven环境终于可以了
说说maven可以后小小的体会吧,虽然还没有用maven运行过工程,体会是pom.xml中的dependency属性可以帮助管理项目中的jar包,只要在这里配置下需要的jar包,保存后就会自动从中央仓 ...