C#编程(三十三)----------Array类
Array类
创建数组
Array intArray1 = Array.CreateInstance(typeof(int), 5);
for (int i = 0; i < 5; i++)
{
intArray1.SetValue(33, i);
}
for (int i = 0; i < 5; i++)
{
Console.WriteLine(intArray1.GetValue(i));
}
Console.ReadKey();
分析:array类是一个抽象类,所以不能使用构造函数来创建数组(不能使用new).但除了可以使用C#语法创建数组实例之外,还可以使用静态方法CreateInstance()创建数组.如果事先不知道元素的类型,该静态方法就非常游泳.因为类型可以作为Type对象传递给CreateInstance()方法.
还可以将使用Array类创建的数组强制转换成声明为int[]的数组:
int[] intArray2 = (int[])intArray1;
CreateInstance()方法有许多重载版本,可以创建多维数组和不基于0的数组:
using System;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
int[] lengths = { 2, 3 };
int[] lowerBounds = { 1, 10 };
Array racers = Array.CreateInstance(typeof(Person), lengths, lowerBounds);
racers.SetValue(new Person("a", "b"), 1, 10);
racers.SetValue(new Person("c", "d"), 1, 11);
racers.SetValue(new Person("e", "f"), 1, 12);
racers.SetValue(new Person("g", "h"), 2, 10);
racers.SetValue(new Person("i", "j"), 2, 11);
racers.SetValue(new Person("k", "l"), 2, 12);
Person[,] racers1 = (Person[,])racers;
Person first = racers1[1, 10];
}
}
public class Person
{
public Person()
{ }
public Person(string firstName, string lastName)
{
this.FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return String.Format("{0} {1}", FirstName, LastName);
}
}
}
使用SetValue()方法设置数组的元素,参数是:要设置的值,和当前索引号.
复制数组
因为数组是引用类型,所以江数组变量赋予另一个数组变量,就会得到两个引用同一数组的变量.而复制数组,会使数组实现ICloneable接口.这个接口定义的Clone()方法会创建数组的浅表副本.
如果数组的元素是值类型,则:
如果数组包含引用类型,则不复制元素,而知复制引用.
除了使用Clone()方法之外,还可以使用Array.Copy()方法创建浅表副本.但Clone()方法和Copy()方法有一个重要区别:Clone()方法会创建一个新数组,而Copy()方法必须传递阶数相同且有足够元素的已有数组.
如果需要包含引用类型的数组的深层副本,就必须迭代数组并创建对象.
排序
string[] names = {"zhao","qian","sun","li" };
Array.Sort(names);
foreach (var item in names)
{
Console.WriteLine(item);
}
Console.ReadKey();
排序后的结果:
li
qian
sun
zhao
由此看见,排序是按照字典序排列.
如果对数组使用自定义类,就必须事先IComparable接口.这个接口定义了一个方法CompareTo(),如果要比较的对象相等,该方法就返回0.如果该实例应拍在参数对象的前面,该方法就返回小于0的值.如果该实例应排在参数对象的后面,该方法就返回大于0的值.
案例:
public class Person:IComparable<Person>
{
public Person()
{ }
public Person(string firstName, string lastName)
{
this.FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return String.Format("{0} {1}", FirstName, LastName);
}
public int CompareTo(Person other)
{
if (other==null)
{
throw new ArgumentNullException("other");
}
int result = this.LastName.CompareTo(other.LastName);
if (result==0)
{
result = this.FirstName.CompareTo(other.FirstName);
}
return result;
}
}
编写测试代码:
static void Main(string[] args)
{
Person[] persons ={
new Person{FirstName="shan",LastName="yongxu"},
new Person{FirstName="sun",LastName="yanzhao"},
new Person{FirstName="zhu",LastName="haitao"},
new Person{FirstName="wang",LastName="jiwei"}
};
Array.Sort(persons);
foreach (var item in persons)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
这样是按照名排序,不是按照姓排序.
如果Person对象的排序方式与上述不同,或者不能修改在数组中用作元素的类,就可以实现IComparer接口或IComparer<T>接口.这两个接口定义了方法Compare().要比较的类必须实现这两个接口之一.ICompare接口的Compare()方法定义了两个要比较的参数的原因.其返回值与IComparable接口的CompareTo()方法类似.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public enum PersonCompareType
{
FirstName,
LastName
}
public class PersonComparer : IComparer<Person>
{
private PersonCompareType compareType;
public PersonComparer(PersonCompareType compareType)
{
this.compareType = compareType;
}
public int Compare(Person x, Person y)
{
if (x==null||y==null)
{
throw new ArgumentNullException("x==y");
}
switch (compareType)
{
case PersonCompareType.FirstName:
return x.FirstName.CompareTo(y.FirstName);
case PersonCompareType.LastName:
return x.LastName.CompareTo(y.LastName);
default:
throw new ArgumentNullException("type");
}
}
}
class Program
{
static void Main(string[] args)
{
Person[] persons ={
new Person{FirstName="shan",LastName="yongxu"},
new Person{FirstName="sun",LastName="yanzhao"},
new Person{FirstName="zhu",LastName="haitao"},
new Person{FirstName="wang",LastName="jiwei"}
};
Array.Sort(persons,new PersonComparer(PersonCompareType.FirstName));
foreach (var item in persons)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
public class Person : IComparable<Person>
{
public Person()
{ }
public Person(string firstName, string lastName)
{
this.FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return String.Format("{0} {1}", FirstName, LastName);
}
public int CompareTo(Person other)
{
if (other == null)
{
throw new ArgumentNullException("other");
}
int result = this.LastName.CompareTo(other.LastName);
if (result == 0)
{
result = this.FirstName.CompareTo(other.FirstName);
}
return result;
}
}
}
分析:类PersonComparer实现了IComparer<Person>接口,可以按照FirstName或LastName对象排序.枚举PersonComparerType定义了可用于PersonComparer的排序选项:FirstName和LastName.排序方式由PersonComparer类的构造函数定义,在该构造函数中设置了一个PersonComparerType值.实现Compare()方法时用一个switch语句指定是按照FirstName还是LastName排序.
这样就可以按照你的需要来排序;是按照姓排序,还是按照名排序?
Array类还提供了Sort方法,需要将一个委托作为参数,这个参数可以传递给方法,从而比较两个对象,而不需要依赖IComparable或IComparer接口.
转载于:https://www.cnblogs.com/FinleyJiang/p/7602566.html
C#编程(三十三)----------Array类相关推荐
- 游戏编程之十三 3D类游戏
视频课:[免费]跨平台APP JQuery Mobile开发-1-初探移动开发-张晨光的在线视频教程-CSDN程序员研修院 第一节 3D类游戏 设计3D光线投射游戏包括从高解析度图形到快速动画的许多技 ...
- Python:使用threading模块实现多线程编程三[threading.Thread类的重要函数]
这篇文章主要介绍threading模块中的主类Thread的一些主要方法,实例代码如下: Python代码 ''''' Created on 2012-9-7 @author: walfred @m ...
- 高级shell编程笔记(第三十三章 杂项)
第三十三章 杂项 33.1 交互式和非交互式的shell和脚本 交互式的shell在tty终端从用户的输入中读取命令.另一方面,shell能在启动时读取启动文件,显示一个提示符并默认激活作业控制.用户 ...
- 程序员编程艺术第三十二~三十三章:最小操作数,木块砌墙问题
第三十二~三十三章:最小操作数,木块砌墙问题 作者:July.caopengcs.红色标记.致谢:fuwutu.demo. 时间:二零一三年八月十二日 题记 再过一两月,便又到了每年的九月十月校招高峰 ...
- 《JAVA》编程创建一个Box类(长方体),在Box类中定义三个变量
问题:编程创建一个Box类(长方体),在Box类中定义三个变量,分别表示长方体的长(length).宽(width)和高(heigth),再定义一个方法void setBox(int l, int w ...
- 类与对象练习题(三)---Array/Person类
在刚开始学习c++的时候刷了很多基础题,这些基础题比较适合初学C++的码友,所以在学完就立即进行了整理,一是为了让初学C++的码友有所参考,二也是为了复习一下所学过知识. 但因为当时在整理时,时间有点 ...
- ASP.NET程序中常用的三十三种代码(转载)
asp.net程序中最常用的三十三种编程代码,为初学者多多积累经验,为高手们归纳总结,看了觉得很有价值~,大家不妨参考下! 1. 打开新的窗口并传送参数: 传送参数: response.write(& ...
- [转]Windows Shell 编程 第十三章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988004】...
第十三章 Windows脚本环境 现在的许多开发人员以前都是在MS-DOS环境下编程的.几乎所有人都接触过批处理文件--一种基于文本命令的文件.这种文件使你能够在一个可执行命令中组合多个指令.批处理文 ...
- 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)
原文:学习ASP.NET Core Razor 编程系列十三--文件上传功能(一) 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习A ...
最新文章
- MASM6.1使用方法(适合初学者)
- Leetcode 378. 有序矩阵中第K小的元素 解题思路及C++实现
- Log4j详细介绍(七)----日志格式化器Layout
- PMP考试心得分享(已通过)
- 机器认知、人机交互、边缘计算……在这里,他们谈论了关于AI的关键议题
- php 模态框效果,评论:超酷的模态框效果 - Nifty
- allegro设置区域规则
- python编辑svg文件_使用Python创建SVG
- 美世家无线点菜android,美世家无线点菜成功实现iPad mini平台应用
- “语象观察”-爬取人民日报并统计词频
- mxGraph画图区域使用鼠标滚轮实现放大/缩小
- 安卓7.0以后如何开启手电筒
- 程序模拟网易163邮箱注册帮助文档
- 代驾APP_第一章_项目环境搭建_第一节
- 猫 老鼠 人的编程题
- AppImage 设置为图标启动(以 Wiznote和Navicat 为例)
- jsp70150宠物寄领养系统
- 关于软件开发,测试什么时候介入项目
- 100层楼和两个玻璃球
- 暑期后端培训(sql语句及数据库连接)
热门文章
- python调用库实现返回ping的时延_python在windows下实现ping操作并接收返回信息
- oracle迁移 rman,ORACLE RMAN迁移
- mybatis 不等于_MyBatis 第一天
- C++socket编程(四):4.2 创建XTcp动态链接库项目
- python猴子吃桃子的问题_非人哉:明星带货却生意惨淡,猴哥心太大,这一帮猴子猴孙不省心...
- java socket 消息中转,Java中Socket实现消息传输(传输原型)
- linuxweb服务器域名网站,linux web服务器目录
- C语言标准库<limits.h>
- PannerNode
- MySQL Spatial Analysis Functions(空间计算方法)