在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. Flex 布局浅析

    除了 CSS 中传统的布局系统之外,CSS3还提供了一个新布局系统.在这个新的框模型中,框的子代采用水平或垂直布局,而且可将未使用的空间分配给特定的子代,或者通过“弹性”分配给应展开的子代,在各子代间 ...

  2. 校招小白机考入坑之从键盘输入java的各种数据类型

    //1.从键盘输入一个整型(其他基本类型类似) Scanner sc =new Scanner(System.in); sc.hasNextInt(); int str1 = sc.nextInt() ...

  3. 将SqlDataReader 数据集转化为datatbale ,在将datatable 转化为iList

    public IList GetModelList(string tablename, string where) { IList list = null; DataTable dataTable = ...

  4. 3.azkaban3.0测试

    测试目标 azkaban多executor下flow的分配方式 azkaban可以同时执行的flow\job个数 azkaban单个job最小使用的内存 相关配置 executor最大线程数: exe ...

  5. MFC常用数据类型

    下面这些是和Win32程序共同使用的数据类型BOOL:布尔值,取值为TRUE or FALSEBSTR:32-bit 字符指针BYTE:8-bit整数,未带正负号COLORREF:32-bit数值,代 ...

  6. 《梦断代码Dreaming In Code》阅读笔记(三)

    最后这几章感觉上更多是从软件完成整体上来讲的.比如说技术.方法等. 在我看来,其实一个团队一直坚持一种好的.先进的方法是不可少的.如果一个优秀的团队刚愎自用,只随着成员们喜好发展,那不能长久.比如说, ...

  7. Android 上实现非root的 Traceroute -- 非Root权限下移植可执行二进制文件 脚本文件

    作者 : 万境绝尘 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/36438365 示例代码下载 : -- CSDN : htt ...

  8. CodeForces - 792C Divide by Three (DP做法)

    C. Divide by Three time limit per test: 1 second memory limit per test: 256 megabytes input: standar ...

  9. object-oriented 第二次作业(2)

    面向对象程序设计自学计划 由于我的英文实在是很差,所以我就没有去考虑看英文的课程视频.网络上的课程有很多,什么学校的也有,一开始我不知道该如何开始选择课程.感觉每个都还可以.后来在群里的看到别人推荐的 ...

  10. Swift-assert使用时机

    什么时候使用断言呢? 包含下面的情况时使用断言: 1.整型下标索引作为值传给自定义索引实现的参数时,但下标索引值不能太低也不能太高时,使用断言 2.传值给函数但如果这个传过来的值无效时,函数就不能完成 ...