1. 实现通用打印泛型类,可以打印各个集合中的值,方便调试。
internal class ArrTools //定义一个类
{
//定义一个静态泛型方法,参数类型为IEnumerable<T>,可以处理任何实现了 IEnumerable<T> 接口的集合类型
static public void OutPrint<T>(IEnumerable<T> collection)
{
//用foreach遍历集合并打印输出
foreach (T item in collection)
{
Console.Write(item+" ");
}
Console.WriteLine();
}
}
2. 计算遍历目录的耗时。
- 用 Stopwatch 统计程序执行的时间。
- 用 Directory.GetFiles 获取目录下的文件。
- 用 Directory.GetDirectories 获取目录下的子目录。
internal class Program
{
static void Main(string[] args)
{
string filepath = @"D:\Nodejs";
Stopwatch sw = new Stopwatch();
//开始计时
sw.Start();
traverse(filepath);
//停止计时
sw.Stop();
//输出总耗时
Console.WriteLine($"检索总时间为{sw.ElapsedMilliseconds}ms");
Console.ReadKey();
}
//创建一个静态方法用于查询文件
static void traverse(string path)
{
// 遍历目录下的所有文件
foreach (string file in Directory.GetFiles(path))
{
Console.WriteLine(file);
}
//遍历目录下的所有子目录
foreach (string directory in Directory.GetDirectories(path))
{
// 递归遍历子目录
traverse(directory);
}
}
运行结果如下:
3. 有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符。
3.1. 算数运算符
运算符 | 含义 | 示例 |
+ | 加 | x+y; x+3 |
- | 减 | x - y; x-3 |
* | 乘 | x * y; |
/ | 除 | x / y |
% | 取模 | x % y; 11%3 |
++ | 递增 | ++x ; x++ |
-- | 递减 | --x ; x-- |
注意:
进行除运算时,两个操作数都是整型数据类型时,其计算结果也是整型。
5/2 = 2;
4/2 = 2;
5/2.0 = 2.5;
"%"模运算,获得整数除法运算的余数,所以也称取余。
11%3 // 结果等于2
12%3 // 结果等于0
11.0%3 // 结果等于2,可作用于浮点类型的操作数
递增和递减操作
++x // 先将x加一个单位,然后再将计算结果作为表达式的值。
x++ // 先将x的值作为表达式的值,然后再将x加一个单位
int x , y ;
x=5 ; y=++x ; // x和y都等于6
x=5 ; y=x++ ; // x的值是6,y的值是5
3.2. 关系运算符
运算符 | 操作 | 结果(操作 x,y) |
> | x>y | 如果x大于y,则为true,否则为false |
>= | x>=y | 如果x大于等于y,则为true,否则为false |
< | x<y | 如果x小于y,则为true,否则为false |
<= | x<=y | 如果x小于等于y,则为true,否则为false |
== | x==y | 如果x等于y,则为true,否则为false |
!= | x!=y | 如果x不等于y,则为true,否则为false |
3.3. 逻辑运算符
运算符 | 操作 | 含义 |
逻辑与(&&) | x && y | 当x,y都为true,运算结果为true |
逻辑或( || ) | x || y | 当x,y其中一个为true,结果为true |
逻辑非(!) | ! x | 当x为true,将x变为false |
x | y | !x | x && y | x || y |
true | true | false | true | true |
true | false | false | false | true |
false | true | true | false | true |
false | false | true | false | false |
3.4. 位运算符
运算符 | 含义 | 运算符 | 含义 |
& | 按位与 | ~ | 按位取反 |
| | 按位或 | >> | 右移 |
^ | 按位异或 | << | 左移 |
3.5. 赋值运算符
运算符 | 操作 | 含义 |
简单赋值(=) | x = 10 | 给x赋值 |
加法赋值(+=) | x += 3 | 等价于 x = x + 3 |
减法赋值(-=) | x -= 2 | 等价于 x = x - 2 |
乘法赋值(*=) | x *= 4 | 等价于 x = x * 4 |
除法赋值(/=) | x /= 2 | 等价于x = x / 2 |
取模赋值(%=) | x %= 5 | 等价于 x = x % 5 |
按位与赋值(&=) | x &= 0xFF(十六进制数) | x = x & 0xFF |
按位或赋值(|=) | x |= 0x0F(十六进制数) | x = x | 0x0F |
按位异或赋值(^=) | x ^= 0xF0(十六进制数) | x = x ^ 0xF0 |
左移赋值(<<=) | x <<= 2 | 等价于 x = x << 2 |
右移赋值(>>=) | x >>= 3 | 等价于 x = x >> 3 |
0x代表这是一个十六进制数
按位与赋值(&=)
x = x & 0xFF ,0xFF转化为二进制数为(1111 1111)。
x 的二进制数为 1010 1010 ,进行按位与赋值 两数都为1,结果即为1
1111 1111
运算结果 1010 1010 十进制数 170
按位或赋值(|=)
x = x | 0x0F,0x0F 二进制数为(0000 1111)
x的二进制数为 1010 1010 两数有一个为1,结果即为1
0000 1111
结果 1010 1111 十进制数 175
按位异或赋值(^=)
x ^= 0xF0 0xF0 二进制为(1111 0000)
异或运算 两个对应的二进制位相同,结果为 0,否则为 1
x为 1010 1010
1111 0000
结果 0101 1010 十进制数 90
4. 三目表达式举例
运算规则
(表达式) ? (x1) : (x2)
当表达式条件为true 返回x1
当表达式条件为false 返回x1
举例
int x = 5, y = 10;
int max = (x > y) ? x : y; //max = 10
5. 优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件。
根据它们所执行运算的特点和它们的优先级,将它们归为7个等级:1、单元运算符和括号。2、常规算术运算符。3、位移运算符。4、比较运算符。5、逻辑运算符。6、各种赋值运算符。7、右位(后缀)单元运算符。
无论是横向还是竖向,越靠前优先级越高
第1级 | ++、--(做为前缀)、()、+、-(做为单元运算符时)、!、~。 |
第2级 | *、/、%、+、-。 |
第3级 | <<、>>。 |
第4级 | <、>、<=、>=、==、!=。 |
第5级 | &、^、|、&&、||。 |
第6级 | =、*=、/=、%=、+=、-=、<<=、>>=、&=、^=、|=。 |
第7级 | ++、--(做为后缀)。 |
6. 写个例子展示break、continue、ruturn的区别
6.1. break
break直接退出整个循环
static void Main(string[] args)
{
for(int i = 0; i < 10; i++)
{
if(i == 3) //当i=3时,进入if
{
break; //此时退出整个循环,整个程序输出结果为0 1 2
}
Console.Write(i);
}
Console.ReadKey();
}
6.2. continue
退出本次循环,继续下一次循环
static void Main(string[] args)
{
for(int i = 0; i < 10; i++)
{
if(i == 3)
{
continue; //执行到此,退出本次循环,开始下一次循环
}
Console.Write(i+" "); //整个程序输出结果为0 1 2 4 5 6 7 8 9
}
Console.ReadKey();
}
6.3. return
return 语句主要用于从函数中返回一个值或对象,这个值或对象就是函数的执行结果。当 return 语句执行时,会立即退出当前函数,后续的函数代码不会被执行。
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine(Fun(3)); //输出结果为1
Console.ReadKey();
}
//创建一个静态方法用于查询文件
public static int Fun(int num)
{
if(num == 3)
{
return 1; //执行该语句后,退出Fun函数,后续代码不会执行
}
Console.WriteLine("我在return后边");
return 0;
}
}
7. 写个冒泡排序
static void Main(string[] args)
{
int[] arr = {3,2,6,4,1,9,18,30,21 };
//外层循环控制排序的轮数
for(int i = 0; i < arr.Length - 1; i++)
{
//内层循环比较相邻的两个元素,如果前一个元素比后一个元素大,就交换它们的位置。
//首轮i=0,j的长度需要-1,防止j到数组的最后一个元素造成程序异常,比较一轮会排除一个
//最大的数,所以还需要减 i 排除已经有序的元素
for(int j = 0; j < arr.Length -i-1; j++)
{
int temp = 0;
if (arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
foreach(var i in arr)
{
Console.Write(i+" ");
//输出结果为1 2 3 4 6 9 18 21 30
}
Console.ReadKey();
}
8. 写个九九乘法表
static void Main(string[] args)
{
//外层循环控制层数
for (int i = 1;i<=9;i++)
{
//内层循环根据层数确定范围进行计算
for (int j = 1; j<=i ; j++)
{
Console.Write($"{j}*{i}={i*j} ");
}
Console.WriteLine();
}
Console.ReadKey();
}
输出结果为
9. 实现文件找不到抛出异常
异常捕获应用 try-catch ,将可能出现异常的代码放入 try 里,处理异常的代码放入catch中
在catch中可以做很多操作:
- 记录异常信息,如打印堆栈跟踪信息。
- 采取适当的措施来恢复程序的正常执行。
- 返回一个合理的默认值。
- 向上抛出更高层级的异常。
同时还可以使用 finally 块来确保某些代码无论是否抛出异常都会执行。
try
{
// 可能抛出异常的代码
}
catch (Exception ex)
{
// 处理异常的代码
}
finally
{
//代码
}
try
{
//File.OpenRead() 方法在文件不存在时会抛出 FileNotFoundException 异常。
FileStream fs = File.OpenRead("D:\\temp\\temp.txt");
}
catch(FileNotFoundException ex) //捕获异常
{
Console.WriteLine("文件不存在");//文件不存在时执行该代码
}
finally {
Console.WriteLine("666"); //无论是否有异常都会执行
}
Console.ReadKey();
//文件存在时输出:666
//文件不存在时输出: 文件不存在
// 666