在C#中对数组的定义比较灵活。这里着重说一下自定义数组和Array类的排序。

在Array类中通过属性Length就可以获取整个数组中数据的数量,可以通过foreach迭代数组。

使用Rank属性可以获取数组的维数,通过属性LongLength也可获取数组中数据的数量,但是基本上不用。

它是当数组中放置的数据量超出了整数的范围时才用。

Array类中排序的方法比较简单,对于string 和 Int 类型直接用Array.Sort()就可以。

但是对于自定义的数组就需要在类中写出Array.Sort()中使用的排序方法。

如下:

 namespace ArrayStudy
{
//类需要实现IComparable<>接口
public class Person:IComparable<Person>
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return string.Format("{0} {1}",FirstName,LastName);
}
//CompareTo是IComparable接口里面的函数
//如果相比较的两个相等,结果是0
//Array.sort()会根据返回的值进行排序
public int CompareTo(Person other)
{
if(other==null)
{
throw new ArgumentNullException("other");
}
int result = this.FirstName.CompareTo(other.FirstName);
if(result==)
{
result = this.LastName.CompareTo(other.LastName);
}
return result;
}
}
}

上面的类中,是对FirstName 排序的,如果FirstName相同,就比较LastName.

主函数调用方式如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ArrayStudy
{
class Program
{
static void Main(string[] args)
{
Person[] person ={
new Person{FirstName="Chen",LastName="Long"},
new Person{FirstName="Wang",LastName="Xinyu"},
new Person{FirstName="Jia",LastName="Yankun"},
new Person{FirstName="Jiao",LastName="Yuanyuan"},
new Person{FirstName="Zhang",LastName="Huangjian"}
}; Array.Sort(person);
foreach(Person p in person)
{
Console.WriteLine(p.ToString());
}
Console.WriteLine("Rank:{0}",person.Rank);
Console.WriteLine("LongLength:{0}",person.LongLength);
Console.WriteLine("Length:{0}",person.Length);
Console.ReadKey();
return;
}
}
}

而对于不能确定要对哪一个变量进行排序的时候就需要增加一个新的比较类。这个类是实现了IComparer<>接口.

在这个接口里面含有int Compare(T x,T y)比较函数,里面含有两个变量。

 namespace ArrayStudy
{
//首先定义枚举的类型,在下面的switch中进行判断
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) throw new ArgumentNullException("x");
if (y == null) throw new ArgumentNullException("y");
int result = x.FirstName.CompareTo(y.FirstName);
int result2= x.LastName.CompareTo(y.LastName);
switch(comparetype)
{
//如果对目标类型排序发现相同,就对另外一个排序并返回值
case PersonCompareType.FirstName:
{
if (result == )
return result2;
return result;
}
case PersonCompareType.LastName:
{
if (result2 == )
return result;
return result2;
}
default :
throw new ArgumentException(
"unexpected compare type"
);
}
}
}
}

将主函数中的排序改成如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ArrayStudy
{
class Program
{
static void Main(string[] args)
{
Person[] person ={
new Person{FirstName="Chen",LastName="Long"},
new Person{FirstName="Wang",LastName="Xinyu"},
new Person{FirstName="Jia",LastName="Yankun"},
new Person{FirstName="Jiao",LastName="Yuanyuan"},
new Person{FirstName="Zhang",LastName="Huangjian"}
}; //在Sort()后面添加第二个参数,这个参数是比较的方法类型
Array.Sort(person,new PersonComparer(PersonCompareType.FirstName));
foreach(Person p in person)
{
Console.WriteLine(p.ToString());
}
Console.WriteLine("Rank:{0}",person.Rank);
Console.WriteLine("LongLength:{0}",person.LongLength);
Console.WriteLine("Length:{0}",person.Length);
Console.ReadKey();
return;
}
}
}

这样便可以灵活选择排序的对象了。

C#学习之自定义数组及其排序的更多相关文章

  1. Hadoop学习之自定义二次排序

    一.概述    MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往 往有要对reduce输出结果进行二次排 ...

  2. js 数组随机排序

    仅用于个人学习记录 javascript 数组随机排序1.最简洁的方法:function randomsort(a, b) {    return Math.random()>.5 ? -1 : ...

  3. Objective-C之NSArray(数组)默认排序与自定义排序

    在讲OC中数组的排序之前我先上一段代码,它是简单数组排序的一种方法(也就是元素是字符串或者数据的数组,因为后面要讲元素为类的数组排序) 代码1: NSArray *sortArr4 = [sortAr ...

  4. 日常学习随笔-自定义了一个MyArrayListDefin集合(数组扩容+迭代器+JDK1.8新方法+详细说明)

    一.自定义了一个ArrayList的模拟集合(源码+详细说明) 前段时间分析了下ArrayList集合的源码,总觉得如果不自己定义一个的话,好像缺了点什么,所以有了如下的代码. 代码可以说是逐行注释了 ...

  5. java面试题:已知一个数组[2,4,6,2,1,5],将该数组进行排序(降序,不能用工具类进行排序),创建两条线程交替输出排序后的数组,线程名自定义

    package com.swift; import java.util.Arrays; import java.util.Comparator; public class ArrayThread_Te ...

  6. java学习之—合并两个数组并排序

    /** * 合并两个数组并排序 * Create by Administrator * 2018/6/26 0026 * 下午 4:29 **/ public class MergeApp { pub ...

  7. [JS深入学习]——数组对象排序

    (转) JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序. sort() 方法用于对数组的元素进行排序.语法如下: arrayObject. ...

  8. PHP数组的排序函数

    对保存在数组中的相关数据进行排序是一件非常有意义的事情.在PHP中提供了很多函数可以对数组进行排序,这些函数提供了多种排序的方法.例如,可以通过元素的值或键及自定义排序等. ①简单的数组排序函数简单的 ...

  9. 重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

随机推荐

  1. 2018牛客多校第二场a题

    一个人可以走一步或者跳x步,但不能连着跳,问到这个区间里有几种走法 考虑两种状态  对于这一点,我可以走过来,前面是怎么样的我不用管,也可以跳过来但是,跳过来必须保证前一步是走的 dp[i][0]表示 ...

  2. LCD1602指令集解读

    LCD1602指令集(11个)     1.清屏指令(clear display)   RS=0 ,R/w=0, 01H 功能:清除液晶显示器,即将DDRAM中的内容全部填入20H(空白字符)     ...

  3. 关于mysql开元数据库的几个随想

    现在已经是凌晨了,昨天晚上写了我人生中的第一篇笔记,觉得没什么可写的,写了一个多小时都没写出什么,现在突然想写点东西了,这是一个比较有趣的问题,前两个月换了新工作,记得当初面试这份工作的时候面试到第三 ...

  4. ajax获取动态列表数据后的分页问题

    ajax获取动态列表数据后的分页问题 这是我在写前台网站时遇到的一个分页问题,由于数据是通过ajax的方式来请求得到的,如果引入相应的js文件来做分页,假如只是静态的填放数据到列表各项内容中(列表条数 ...

  5. es6从零学习(一)let 和 const 命令

    es6从零学习(一):let 和 const 命令 一:let 变量 1.块级作用域{}:let只在自己的块级作用域内有效. for(let i =0;i<3;i++) { console.lo ...

  6. 定点数(fixed-point number)

    定义 定点数(fixed-point number)就是小数点位置固定的数,也就是说,小数点后面的位数是固定的,比如要记录一笔账目,这些账目的数字都不会超过100,就可以使用2位小数位定点数来记录,比 ...

  7. PSP1123

    PSP时间图: 类型 任务 开始时间 结束时间 净时间 中断时间 日期 开会 开会 16:17 16:50 33 0 20171027 开会 开会 17:00 17:22 22 0 20171028 ...

  8. Alpha发布文案+美工

    文案: Alpha发布文稿 我们是Hello World!团队,下面由我来简要介绍一下我们组的作品,我们组做的是一个飞机射击类游戏,名字叫做空天猎.这个游戏是基于JAVA平台创建的,那么接下来让我给大 ...

  9. python循环解码base64

    第一次写博客,都不知道该如何下手,写的不是很好,还望各位大佬不要喷我. 先来介绍一下base64: Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打 ...

  10. 【Docker】- 基本命令

    1.docker ps -a    显示所有容器 2.doker ps -l 显示最近一次启动的容器 3.docker ps   显示正在运行的容器 4.docker start [容器ID]  启动 ...