1. 实现通用打印泛型类,可以打印各个集合中的值,方便调试。
namespace Djproject
{
//泛型类
internal class DJUtils
{
//通用的打印
//必须继承IEnumerable接口的类,满足它才能进行迭代
static public void println<T>(IEnumerable<T> collection)
{
foreach (T item in collection)
{
Console.Write(item+" "); ;
}
Console.WriteLine( );
}
}
}
List<string> nameList = new List<string>();
nameList.Add("陈晨");
nameList.Add("存储");
DJUtils.println(nameList);
int[] val = {1,2,3};
DJUtils.println(val);
LinkedList<string> list = new LinkedList<string>();
list.AddLast("刘备");
list.AddLast("关羽");
list.AddLast("张飞");
DJUtils.println(list);
2. 计算遍历目录的耗时。
代码实现:
namespace Djproject
{
// 定义一个内部类TraverseFile,它不能从当前程序之外被访问
internal class TraverseFile
{
Stopwatch sw = Stopwatch.StartNew();
// 定义TraverseDirectory方法,它接受一个字符串参数dir,表示要遍历的目录的路径
public void TraverseDirectory(string dir)
{
sw.Start();
// 打印一条消息,表明当前开始遍历的目录
Console.WriteLine($"遍历开始: {dir}");
// 使用Directory.GetFiles方法获取指定目录下所有文件的路径,并存储在字符串数组files中
string[] files = Directory.GetFiles(dir);
// 遍历files数组中的每个文件路径
foreach (string file in files)
{
// 使用file路径创建一个FileInfo对象,以便获取有关文件的更多信息
FileInfo fileInfo = new FileInfo(file);
// 使用Console.WriteLine打印文件的名称、扩展名和大小
Console.WriteLine($"文件名:{fileInfo.Name}, 扩展名:{fileInfo.Extension}, 文件大小:{fileInfo.Length}");
}
// 使用Directory.GetDirectories方法获取指定目录下所有子目录的路径,并存储在字符串数组directory中
string[] directory = Directory.GetDirectories(dir);
// 遍历directory数组中的每个子目录路径
foreach (string dry in directory)
{
// 递归调用TraverseDirectory方法,传入当前子目录的路径作为参数,以便遍历该子目录及其子目录
TraverseDirectory(dry);
}
// 当所有文件和子目录都被遍历后,打印一条消息表明当前目录的遍历已经结束
Console.WriteLine($"遍历结束: {dir}");
sw.Stop();
Console.WriteLine("耗时:{0}毫秒", sw.ElapsedMilliseconds);
}
}
}
//声明了一个TraverseFile类型的变量tD,并通过调用TraverseFile类的构造函数来实例化该变量
TraverseFile tD = new TraverseFile();
//指定了要遍历的目录的路径
tD.TraverseDirectory("D:\\list\\PYTHON\\db");
3. 有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符。
算术运算符:
(1)加法运算符 (+
): 用于将两个操作数相加。如果操作数是数字,则执行加法运算;如果操作数是字符串,则执行字符串连接操作。
(2)减法运算符 (-
): 用于从第一个操作数中减去第二个操作数。
(3)乘法运算符 (*
): 用于将两个操作数相乘。
(4)除法运算符 (/
): 用于将第一个操作数除以第二个操作数。结果是一个浮点数或双精度数,具体取决于操作数的类型。
(5)取模运算符 (%
): 模运算符或余数运算符,用于求两个数相除后的余数。
(6)递增运算符 (++
): 用于将变量的值增加1。它有两种形式:前缀递增(++x
)和后缀递增(x++
)。前缀递增会先增加变量的值,然后返回新的值;后缀递增会返回变量的当前值,然后再增加变量的值。
(7)递减运算符 (--
): 有两种形式:前缀递减(--x
)和后缀递减(x--
)。
(8)复合赋值运算符: 结合了算术运算符和赋值运算符(=
)。例如,+=
是加法和赋值运算符的结合,x += y;
等价于 x = x + y;
。类似的运算符还有 -=
、*=
、/=
和 %=
。
关系运算符:
以下是C#中常见的关系运算符:
(1)等于运算符 (==
): 检查两个操作数的值是否相等。如果相等,则表达式的结果为 true
;否则为 false
。
(2)不等于运算符 (!=
): 检查两个操作数的值是否不相等。如果不相等,则表达式的结果为 true
;否则为 false
。
(3)大于运算符 (>
): 检查左操作数的值是否大于右操作数的值。如果是,则表达式的结果为 true
;否则为 false
。
(4)小于运算符 (<
): 检查左操作数的值是否小于右操作数的值。如果是,则表达式的结果为 true
;否则为 false
。
(5)大于等于运算符 (>=
): 检查左操作数的值是否大于或等于右操作数的值。如果是,则表达式的结果为 true
;否则为 false
。
(6)小于等于运算符 (<=
): 检查左操作数的值是否小于或等于右操作数的值。如果是,则表达式的结果为 true
;否则为 false
。
逻辑运算符:
(1) 逻辑与(&&):也称为短路与运算符。
1)对两个布尔值进行逻辑与运算,如果两个操作数都为true
,则结果为true
;否则为false
。
2)如果第一个操作数为false
,则不会评估第二个操作数,因为无论第二个操作数的值是什么,结果都将是false
。
(2)逻辑或(||):也称为短路或运算符。
1)对两个布尔值进行逻辑或运算,如果两个操作数中至少有一个为true
,则结果为true
;如果两个操作数都为false
,则结果为false
。
2)如果第一个操作数为true
,则不会评估第二个操作数,因为无论第二个操作数的值是什么,结果都将是true
。
(3)逻辑非(!):
1)是一元运算符,用于对其后的布尔值进行取反。
2)如果操作数为true
,则结果为false
;如果操作数为false
,则结果为true
。
位运算符:
(1)与(&):
1) 对两个数的二进制形式进行逐位与操作。只有当两个相应的二进制位都为1时,结果位才为1,否则为0。
2)示例:5 & 3
(二进制形式为101 & 011
)结果为1
(二进制001
)。
(2)或(|):
1)对两个数的二进制形式进行逐位或操作。只要两个相应的二进制位中有一个为1,结果位就为1。
2)示例:5 | 3
(二进制形式为101 | 011
)结果为7
(二进制111
)。
(3)异或(^):
1)对两个数的二进制形式进行逐位异或操作。当两个相应的二进制位不相同时,结果位为1;相同时,结果位为0。
2)示例:5 ^ 3
(二进制形式为101 ^ 011
)结果为6
(二进制110
)。
(4)取反(~):
1)是一元运算符,用于对其操作数的二进制形式进行逐位取反操作。即0变为1,1变为0。
2)注意:对于整数,按位取反通常会影响符号位,可能导致正数变成负数,负数变成正数(取决于具体的二进制表示和补码规则)。
(5)左移(<<):
1)将数的二进制表示向左移动指定的位数,左侧边缘超出的位将被丢弃,而在右侧边缘新增的位将用0填充。
2)相当于乘以2的指定次幂。
3)示例:5 << 2
(二进制形式为101 << 2
)结果为20
(二进制10100
)。
(6)右移(>>):
1)将数的二进制表示向右移动指定的位数,右侧边缘超出的位将被丢弃。
2)相当于除以2的指定次幂,但结果总是向下取整。
3)示例:5 >> 2
(二进制形式为101 >> 2
)结果为1
(二进制001
)。
赋值运算符:
(1)普通赋值(=):
1)将右侧表达式的值赋给左侧的变量或属性。
2)示例:int a = 5;
(2)算术复合赋值运算符(=):
这些运算符结合了赋值和算术操作(加、减、乘、除)。
加法赋值(+=):a += 5; 等同于 a = a + 5;
减法赋值(-=):a -= 3; 等同于 a = a - 3;
乘法赋值(*=):a *= 2; 等同于 a = a * 2;
除法赋值(/=):a /= 2; 等同于 a = a / 2;
求余赋值(%=):a %= 3; 等同于 a = a % 3;
(3)位复合赋值运算符:
这些运算符结合了赋值和位操作(与、或、异或、左移、右移)。
位与赋值(&=):a &= b; 等同于 a = a & b;
位或赋值(|=):a |= b; 等同于 a = a | b;
位异或赋值(^=):a ^= b; 等同于 a = a ^ b;
左移赋值(<<=):a <<= 2; 等同于 a = a << 2;
右移赋值(>>=):a >>= 2; 等同于 a = a >> 2;
(4)字符串连接赋值(+=,特定于字符串):
当用于字符串时,+= 运算符将右侧的字符串连接到左侧的字符串末尾,并将结果赋给左侧的字符串变量。
示例:string s = "Hello, "; s += "World!"; 结果是 s 变为 "Hello, World!"
(5)空合并赋值运算符(??=):
如果左侧的变量为 null,则将其设置为右侧表达式的值;否则,不改变左侧变量的值。
示例:int? a = null; a ??= 5; 结果是 a 变为 5
4. 三目表达式举例
三目运算符(也称为条件运算符)是一种简洁的表达式,用于根据条件选择两个值中的一个。
它的语法形式为 条件 ? 表达式1 : 表达式2
如果条件为真(true),则整个表达式的结果是表达式1
的结果;如果条件为假(false),则结果是表达式2
的结果。
举例:
int a = 10;
int b = 20;
// 使用三目运算符来比较a和b,并根据结果打印不同的字符串
string result = (a > b) ? "Hello World" : "Hello China";
Console.WriteLine(result); // 输出: Hello China
// 使用三目运算符直接赋值给变量
int max = (a > b) ? a : b;
Console.WriteLine("得到的值: " + max); // 输出: The max value is: 20
// 嵌套的三目运算符示例
string grade = (a > 90) ? "A" : (a > 60) ? "B" : "C";
Console.WriteLine("输出: " + grade);
结果:
5. 优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件。
括号 (()
, {}
, []
):首先计算括号内的表达式。
乘除模取余 (*, /, %
):接下来进行乘法、除法和取余运算。
加减 (+, -
):然后进行加法和减法运算。
位移 (<<
, >>
):接着进行左移和右移操作。
比较 (<
, >
, <=
, >=
, is
, as
):之后是比较运算,包括关系比较和类型检查。
相等不等 (==
, !=
):进行相等性和不等性的判断。
逻辑与 (&
):然后是按位与(虽然这里也提到了逻辑与,但&&
是逻辑与,用于短路求值,优先级低于&
)。
逻辑异或 (^
):进行按位异或操作。
逻辑或 (|
):然后是按位或(同样,||
是逻辑或,用于短路求值,优先级低于|
)。
条件运算符 (?:
):使用条件运算符(三元运算符)进行条件选择。
赋值 (=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
):最后进行赋值操作,包括各种复合赋值。
6. 写个例子展示break、continue、ruturn的区别
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 使用break
Console.WriteLine("Using break:");
foreach (var number in numbers)
{
if (number == 5)
{
break; // 退出循环
}
Console.WriteLine(number);
}
// 使用continue
Console.WriteLine("\nUsing continue:");
foreach (var number in numbers)
{
if (number % 2 == 0)
{
continue; // 跳过当前迭代,继续下一次迭代
}
Console.WriteLine(number);
}
Console.WriteLine("\nUsing return:");
DemoReturn(numbers);
static void DemoReturn(int[] numbers)
{
foreach (var number in numbers)
{
if (number > 7)
{
return; // 退出方法
}
Console.WriteLine(number);
}
Console.WriteLine("如果return没有被执行,这段代码将被执行");
}
7. 写个冒泡排序
int[] arr = { 64, 34, 25, 12, 22, 11, 90 };
int n = arr.Length;
Console.WriteLine("原始数组:");
PrintArray(arr);
BubbleSort(arr);
Console.WriteLine("排序后的数组:");
PrintArray(arr);
// 冒泡排序函数
static void BubbleSort(int[] arr)
{
int n = arr.Length;
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
// 交换 arr[j] 和 arr[j+1]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 打印数组的函数
static void PrintArray(int[] arr)
{
foreach (int i in arr)
{
Console.Write(i + " ");
}
Console.WriteLine();
}
8. 写个九九乘法表
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
// 打印每一项,后面跟一个空格
Console.Write("{0}x{1}={2}\t",j,i,i*j);
}
// 每完成一行后换行
Console.WriteLine();
}
9. 实现文件找不到抛出异常
string DatePath = @"D:\list\PYTHON\db\b.txt"; // 假设这个文件不存在
try
{
// 尝试打开文件
//using 语句是一种确保资源被正确释放的模式,无论是否发生异常
//FileStream:通过它读取文件内容、写入文件内容、以及执行其他文件操作
//filePath:表示要打开文件的路径
//FileMode.Open:表示文件必须存在,且文件将被打开以进行读取、写入或两者。如果文件不存在,将抛出 FileNotFoundException 异常
using (FileStream fileStream = new FileStream(DatePath, FileMode.Open))
{
// 如果文件成功打开,可以在这里处理文件
Console.WriteLine("文件已成功打开!");
}
}
//FileNotFoundException:专门用于表示尝试访问的文件或目录未找到的情况,当尝试打开或访问一个不存在的文件时,FileStream、File 等类的方法通常会抛出这个异常。
//ex:引用了捕获到的 FileNotFoundException 实例
catch (FileNotFoundException ex)
{
// 如果文件不存在,将捕获FileNotFoundException异常
Console.WriteLine($"无法找到文件,请检查路径是否正确:{DatePath},\n错误详情:{ex.Message}");
}