0%

数组可以说是在任何语言中都非常基本的数据结构了。这篇笔记以C#中的数组为引,再延伸到C#的几种集合类(Collections)以及一些相关的基本概念。

数组 Array

概述

数组存储相同种类的元素,其大小固定,且是顺序存储的,即在内存中占据一段连续的地址。

数组作为一种引用类型(其基类是System.Array),需要用new来创建实例。

1
2
3
4
5
//初始化时指定大小
double[] balance = new double[10];

//可以直接赋值来初始化
int[] marks = {99, 98, 92, 97, 95};

初始化而尚未赋值的数组,编译器会根据其类型隐式地将所有元素设置为默认值。

数组最大的特点还是能够用下标索引来随机访问其中的元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
double salary = balance[9];

//以下是C# 8.0引入的好东西!

//末尾运算符 ^
//[^n]表示[length-n],类似Python用负数索引[-n]表示[length-n]
double salary = balance[^1];

//范围运算符 ..
//[a..b]表示从[a]到[b]的范围(但不包含[b]!),类似Python的切片[a:b]
//省略a代表0,省略b代表^0
double[] salaries1 = balance[..^3];
//如果a比b还大,会抛出异常(Python中则是返回空列表)
double[] salaries2 = balance[3..2]; //ArgumentOutOfRangeException
//a和b一样大时,返回长度为0的集合
double[] salaries3 = balance[3..3];
Console.WriteLine(salaries3.Length); //0

由于实现了IEnumerable接口,数组可以使用foreach...in...的方式进行迭代访问,还可以使用LINQ,这样就无需获取数组长度再用for循环迭代了。关于这个接口及其相关的内容,我在本文稍后的部分记述。

阅读全文 »

前方高能!
这篇笔记断断续续花了近10天,思路、结构较为混沌,如果没有充分做好心理准备,建议立刻关闭窗口。
(其实就是我写完实在不愿审阅)

首先说明,异步是极为高深的高级编程技术,这篇文章只是才疏学浅的我阅读文档之后的一些思考与理解,可能有极多描述不准确乃至完全错误之处,还望批评指导。顺便吐槽,C#文档翻译得实在是太烂了,很多地方一看就是机翻的,却没有机翻警告。很多地方百思不得其解的词,切换到英语就发现其实很简单,翻译的用词完全错误,难受啊!

何为异步

与异步相对的是“同步”,代表着一句代码的执行结束是其后一句代码的执行开始,整个流程是按照固定的顺序进行的,这是一般程序的逻辑。然而,某些语句可能需要花较长时间才能得到结果——比如网络通信和文件读写——这些语句的执行并不怎么占用CPU,但会阻塞整个线程,后续的语句需要等待这些语句执行完成,造成大量的浪费。特别是如果网络环境很不好、读取的文件好几个G,那可是尤其要命,可能整个程序都会出现肉眼可见的卡顿甚至崩溃。

为了解决这种飞快的CPU与龟爬的IO之间的不平衡,传统的方案是单独开个线程让它去执行耗时的操作,让主线程继续运行与耗时操作的结果无关的代码。但是线程操作很麻烦、开销很高,线程数量也有限,不是能随便使用的,所以依然不是个完美的方法。

异步就是为了解决这个问题而存在的。当代码需要执行一个耗时的操作时,它只发出指令,并不等待结果,然后就去执行其他代码了。一段时间后,当耗时操作返回结果时,再通知CPU进行处理。

阅读全文 »

到了清明节,很奇怪的,今年并没有下雨。印象中每年的清明正应那句“清明时节雨纷纷”,这几天就该是细雨连绵,气温恰好舒适得让人头脑清晰。气象数据统计上也反映了这一点。杏花村所在的安徽池州,历年来清明前后的降雨概率高达85%。湖北离得不远,这印象是有基础的。

下不下雨倒是无关紧要,今天有其更大的意义。

新华社北京4月3日电 为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼,国务院今天发布公告,决定2020年4月4日举行全国性哀悼活动。在此期间,全国和驻外使领馆下半旗志哀,全国停止公共娱乐活动。4月4日10时起,全国人民默哀3分钟,汽车、火车、舰船鸣笛,防空警报鸣响。

清明追思

阅读全文 »

准备完了开题答辩,弄完了笔试,又咸鱼了数天、玩了数天《动物森友会》,一下子离上一篇C#杂记过了三个星期。

朔月

所以接下来要填的坑是LINQ和异步。弄完了这个,C#最大的几块拼图才得以完整,大抵能够叫是入了门。

查询表达式

所谓的LINQ,是语言集成查询Language INtegrated Query的缩写。通过引用命名空间System.Linq,可以用可读性极强的、类似SQL查询语句形式的代码对一些数据结构,甚至直接对数据库进行便捷的操作,如查询、排序、分组等,而不必编写大量逻辑复杂的循环代码。LINQ的操作十分高深,这里我仅学习一些基础、常用的LINQ功能。

以下是一个典型的LINQ查询示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static void Main(string[] args){
//数据源
string[] name = {"Alonso", "Zheng", "Smith", "Jones", "Smythe", "Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba", "Fatimah" };

//查询表达式
var queryResults =
from n in names
where n.StartWith("S")
select n;

//迭代查询结果
WriteLine("Name beginning with S:");
foreach(var item in queryResults){
WriteLine(item);
}

Write("Program finished. Press Enter/Return to continue:");
ReadLine();

}
阅读全文 »