跳转至

数据结构

本节介绍的数据结构包括:数组、字符串、元组、枚举、结构体。

一、数组⚓︎

01 数组概述⚓︎

数组:具有相同类型的数据的集合,通过 type[] arrayName 声明数组。

数组的初始化:通过new关键字对数组进行初始化。

数组的赋值:可以在初始化或通过循环结构赋值。

数组的访问:数组具有下表索引(从0开始),可以通过下标直接读取,即 arrayName[index]

Note

  1. C#中的数组是引用类型;
  2. System.Array 是所有数组类型的抽象基类型, 所有数组都会实现 IList 和 IEnumerable
  3. 数组元素可以是任何类型,其中包括数组类型(构成多维数组);
  4. 对于值类型,使用默认值初始化数组元素;
  5. 对于引用类型,包括不可为 null 的类型,都具有值 null
  6. 对于可为 null 的类型,HasValue 被设置为 false,元素将设置为 null.

02 定义数组⚓︎

一维数组⚓︎

示例:

数组声明与赋值
// 声明数组
type[] arrayName; // int[] num;

// 初始化数组
type[] arrayName = new type[len]; // int[] num = new int[5];

// 初始化并赋值
type[] arrayName = new type[]{val0, val1, ...,valLen}; // int[] num = new int[]{0,1};
type[] arrayName = new type[len]{val0, val1, ...,valLen}; // int[] num = new int[2]{0,1};

// 隐式类型
var arrayName = new type[];

// 随机访问
arrayName[index] = 10; // num[2]=10;
Consle.WriteLine(arrayName[index]); // Consle.WriteLine(num[2]);

二维数组⚓︎

03 数组等值判断⚓︎

04 数组常用操作⚓︎

二、字符串⚓︎

01 字符串概述⚓︎

字符串可以看做是字符的数组,同样支持随机访问。

Note

  1. C#中的字符串是引用类型.
  2. 在 C# 中,string 关键字是 System.String 的别名。 因此,String 和 string 是等效的.

02 定义字符串⚓︎

03 字符串等值判断⚓︎

04 字符串常用操作⚓︎

三、元组⚓︎

01 元组概述⚓︎

Note

  1. 元组是值类型;
  2. == 和 != 不会考虑元组的字段名称,只会比较元素值;
  3. System.ValueTuple 和   System.Tuple 都可用于创建元组,但二者不同,主要区别如下:
    1. System.ValueTuple 是结构体 struct; System.Tuple是类class
    2. System.ValueTuple 类型是值类型; System.Tuple 类型是引用类型;
    3. System.ValueTuple 类型是可变的; System.Tuple 类型是不可变的;
    4. System.ValueTuple 类型的数据成员是字段; System.Tuple 类型的数据成员是属性。

02 定义元组⚓︎

// 指定每个元素的类型
(double, int) t1 = (4.5, 3); 
Console.WriteLine($"Tuple with elements {t1.Item1} and {t1.Item2}."); 

// 指定每个元素的类型和字段名
(double Sum, int Count) t2 = (4.5, 3); 
Console.WriteLine($"Sum of {t2.Count} elements is {t2.Sum}."); 

// 使用var隐式类型推断
var t = (Sum: 4.5, Count: 3); 
Console.WriteLine($"Sum of {t.Count} elements is {t.Sum}.");

// 先初始化再赋值
var sum = 4.5; 
var count = 3; 
var t = (sum, count);

03 元组等值判断⚓︎

(int a, byte b) left = (5, 10); 
(long a, int b) right = (5, 10); 
Console.WriteLine(left == right); // output: True 
Console.WriteLine(left != right); // output: False 

var t1 = (A: 5, B: 10); 
var t2 = (B: 5, A: 10); 
Console.WriteLine(t1 == t2); // output: True 
Console.WriteLine(t1 != t2); // output: False

04 元组常用操作⚓︎

四、枚举⚓︎

01 枚举概述⚓︎

Note

  1. 枚举类型是值类型.
  2. System.Enum 类型是所有枚举类型的抽象基类.
  3. 对于任何枚举类型,枚举类型与其基础整型类型之间存在显式转换.
  4. 如果将枚举值转换为其基础类型,则结果为枚举成员的关联整数值.

02 定义枚举⚓︎

enum Season 
{ 
    Spring, 
    Summer, 
    Autumn, 
    Winter 
}

// 显示指定关联常数值类型,并指定常数值
enum ErrorCode : ushort 
{ 
    None = 0, 
    Unknown = 1, 
    ConnectionLost = 100, 
    OutlierReading = 200 
}

03 枚举等值判断⚓︎

04 枚举常用操作⚓︎

五、结构体⚓︎

01 结构体概述⚓︎

Note

  1. C#结构体是值类型,内存分配在栈中,访问速度相对更快.
  2. 结构体可带有方法、字段、索引、属性、运算符方法和事件.
  3. 结构体可定义构造函数,但不能定义析构函数.
  4. 结构体不能继承与被继承.
  5. 结构体可以实现接口.

02 定义结构体⚓︎

struct StructName
{
    identifier type attrName;
    // more
}

// 示例
struct Books  
{  
   public string title;  
   public string author;  
   public string subject;  
   public int book_id;  
};

03 结构体等值判断⚓︎

04 结构体常用操作⚓︎

总结⚓︎

数据结构 类型
数组 引用类型
字符串 引用类型
元组 值类型
枚举 值类型
结构体 值类型