目录
2.2 使用DateTime和DateTime.Now或DateTime.UtcNow
3. 有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符
5. 优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件
6. 写个例子展示break、continue、ruturn的区别
1. 实现通用打印泛型类,可以打印各个集合中的值,方便调试
思路:
定义命名空间:需要定义你的代码将存在于哪个命名空间中
创建类:创建一个类,比如
DjTools
,这个类将包含你的打印工具方法。定义泛型方法:在这个类中,定义一个泛型方法
println
。这个方法将接受一个IEnumerable<T>
类型的参数,其中T
是类型参数,代表任何类型。实现方法体:在
println
方法中,使用foreach
循环遍历传入的集合
代码实现:
namespace DjConsoleApp0527
{
//自定义工具类
internal class DjTools
{
//打印
static public void println<T>(IEnumerable<T> collection)
{
foreach (T item in collection)
{
Console.Write(item+" ");
}
Console.WriteLine();
}
}
}
调用(这里使用List动态数组打印结果调用):
List<string> nameList = new List<string>();
nameList.Add("A");
nameList.Add("B");
DjTools.println(nameList);
2. 计算遍历目录的耗时
定义一个遍历类
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DjConsoleApp0527
{
class DirectoryTraversal
{
public static int totalFiles = 0;
public void TraverseDirectory(string path)
{
try
{
// 获取当前目录下的所有子目录
string[] subdirectories = Directory.GetDirectories(path);
foreach (string subdirectory in subdirectories)
{
// 递归遍历子目录
TraverseDirectory(subdirectory);
}
string[] files = Directory.GetFiles(path);
totalFiles += files.Length; // 更新文件总数
}
catch (Exception ex)
{
// 异常处理:权限不足或目录不存在等情况
Console.WriteLine("发生错误: " + ex.Message);
}
}
}
}
2.1 使用Stopwatch
using DjConsoleApp0527;
using System.Diagnostics;
string path = @"C:\Users\86157\Desktop"; // 更改为要遍历的目标目录
DirectoryTraversal directory = new DirectoryTraversal();
// 开始遍历目录
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
directory.TraverseDirectory(path);
sw.Stop();
Console.WriteLine("消耗时间为:{0}ms", sw.ElapsedMilliseconds);
使用
Stopwatch
:System.Diagnostics.Stopwatch
类是专门为了高精度的时间测量而设计的,它使用了操作系统提供的性能计数器,适合用来测量短时间间隔
2.2 使用DateTime
和DateTime.Now
或DateTime.UtcNow
using DjConsoleApp0527;
using System;
string path = @"C:\Users\86157\Desktop"; // 更改为要遍历的目标目录
DirectoryTraversal directory = new DirectoryTraversal();
// 获取遍历开始的时间点
DateTime startTime = DateTime.Now;
// 开始遍历目录
directory.TraverseDirectory(path);
// 获取遍历结束的时间点
DateTime endTime = DateTime.Now;
// 计算耗时
TimeSpan duration = endTime - startTime;
// 输出耗时
Console.WriteLine("消耗时间为:{0}ms", duration.TotalMilliseconds);
这是最简单的测量时间间隔的方法之一。但请注意,这种方法不够精确,尤其是在测量短时间间隔时,因为
DateTime
的精度取决于操作系统的时间服务,而且在多线程环境中可能不够稳定。
3. 有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符
3.1算数运算符
算术运算符用于执行基本的数学运算
运算符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取模(求余数) |
++ | 前置和后置递增 |
-- | 前置和后置递减 |
3.2 关系运算符
系运算符用于比较两个值,返回一个布尔结果(true
或 false)
运算符 | 描述 |
---|---|
== | 相等 |
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于或等于 |
>= | 大于或等于 |
3.3 逻辑运算符
逻辑运算符用于组合条件表达式,同样返回布尔结果:
运算符 | 描述 |
---|---|
&& | 逻辑与(AND) |
|| | 逻辑或(OR) |
! | 逻辑非(NOT) |
3.4 位运算符
位运算符用于对整数进行按位操作:
运算符 | 描述 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位取反 |
<< | 左移(高位丢弃,低位补零) |
>> | 右移(低位丢弃,高位根据符号位填充) |
3.5 赋值运算符
赋值运算符用于将一个值赋给一个变量:
运算符 | 描述 |
---|---|
= | 简单赋值 |
+= | 加法赋值 |
-= | 减法赋值 |
*= | 乘法赋值 |
/= | 除法赋值 |
%= | 取模赋值 |
&= | 按位与赋值 |
|= | 按位或赋值 |
^= | 按位异或赋值 |
<<= | 左移赋值 |
>>= | 右移赋值 |
4. 三目表达式举例
三目表达式,也被称为条件运算符,在多种编程语言中都有应用,包括C、C++、C#、Java和JavaScript等。它的基本语法是:条件 ? 结果_如果条件为真 : 结果_如果条件为假
代码举例:
int a = 10;
int b = 20;
int max = (a > b) ? a : b; // 如果a大于b,max等于a,否则max等于b
//在更复杂的情况下,三目表达式可以嵌套,也可以用于函数返回值
int x = 4;
Console.WriteLine(x > 5 ? "大于5" : (x > 0 ? "大于0小于等于5" : "小于等于0"));
5. 优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件
有括号先括号:任何包含在圆括号内的表达式都会被优先计算,这允许你改变默认的运算顺序。例如:在表达式
(2 + 3) * 4
中,加法会先于乘法执行。后乘除再加减:在没有括号干预的情况下,乘法和除法的优先级高于加法和减法。例如:在表达式
2 * 3 + 4 / 2
中,乘法和除法会先执行,之后才是加法。然后位移再关系:位移运算符(左移
<<
和右移>>
)的优先级高于关系运算符(如<
、>
、<=
、>=
、==
、!=
)。这意味着在表达式a << 2 > b
中,位移操作会先于关系比较执行。逻辑完后再条件:逻辑运算符(
&&
、||
和!
)的优先级低于位运算符和关系运算符,但高于条件运算符(三目运算符? :
)。例如:在表达式a && b ? "True" : "False"
中,逻辑与操作会先于条件运算执行。
6. 写个例子展示break、continue、ruturn的区别
在C#中,
break
,continue
, 和return
都是用来控制循环和函数流程的关键字,但它们的作用和用法各不相同。
代码例子:
// 使用break提前结束循环
Console.WriteLine("使用break:");
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
Console.WriteLine("找到了5,提前结束循环");
break;
}
Console.WriteLine(i);
}
// 使用continue跳过循环体中的某次迭代
Console.WriteLine();//换行,但是我觉得/n更好用
Console.WriteLine("使用continue:");
for (int i = 0; i < 10; i++)
{
if (i % 2 == 0) // 如果i是偶数,则跳过此次循环
{
continue;
}
Console.WriteLine(i); // 打印奇数
}
// 使用return从方法中返回
static int GetFirstEven(params int[] numbers)
{
foreach (var number in numbers)
{
if (number % 2 == 0)
{
return number; // 返回第一个偶数
}
}
throw new InvalidOperationException("没有找到偶数");
}
Console.WriteLine();
Console.WriteLine("使用return:");
int result = GetFirstEven(1, 3, 5, 8, 10);
Console.WriteLine("第一个偶数是:" + result);
break
:
- 用途:
break
语句主要用于循环结构switch
结构。- 功能:当
break
被执行时,它会立即终止当前的循环或switch
结构的执行,跳转到循环或switch
结束后的下一条语句。
continue
:
- 用途:
continue
语句同样用于循环结构中。- 功能:当
continue
被执行时,它会跳过当前循环迭代的剩余部分,直接进入下一次循环的条件检查阶段。
return
:
- 用途:
return
语句用于从方法或函数中返回,可以结束当前方法的执行,并可选地返回一个值。- 功能:当
return
被执行时,它会立即停止当前方法的执行,返回到调用该方法的地方,如果有返回值,则会将该值传递给调用者。
7. 写个冒泡排序
写一个BubbleSort类
namespace DjConsoleApp0527
{
public class BubbleSort
{
public void Algorithm(int[] arr)
{
int n = arr.Length;
bool swapped;
for (int i = 0; i < n - 1; i++)
{
swapped = false;
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
// 使用异或运算符交换元素
/* arr[j] = arr[j] ^ arr[j + 1];
arr[j + 1] = arr[j] ^ arr[j + 1];
arr[j] = arr[j] ^ arr[j + 1];
swapped = true;*/
//使用中间变量
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
// 如果在这一轮中没有发生交换,说明数组已经排好序
if (!swapped)
break;
}
}
public void Print(int[] arr)
{
foreach (int element in arr)
{
Console.Write(element + " ");
}
Console.WriteLine();
}
}
}
调用算法和打印方法:
using DjConsoleApp0527;
int[] arr = { 64, 34, 25, 12, 22, 11, 90 };
BubbleSort bubbleSort = new BubbleSort();
Console.WriteLine("排序之前:");
bubbleSort.Print(arr);
bubbleSort.Algorithm(arr);
Console.WriteLine("排序之后:");
bubbleSort.Print(arr);
8. 写个九九乘法表
正着打印:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DjConsoleApp0527
{
internal class MultiplicationTable
{
public void println()
{
// 使用两层for循环生成九九乘法表
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
// 打印乘法表达式
Console.Write($"{j} * {i} = {i * j}\t");//\t制表符
}
// 每完成一行,换行
Console.WriteLine();
}
}
}
}
倒着打印就是将循环改为
for (int i = 9; i >= 1; i--)
{
for (int j = i; j >= 1; j--)
{}
}
9. 实现文件找不到抛出异常
异常:程序中的运行时错误,它违反一个系统约束或应用程序约束,或出现了在正常操作时未预料的情形。
using System;
using System.IO;
namespace DjConsoleApp0527
{
public class NofilesFound
{
public void Nofiles(string path)
{
try
{
// 尝试读取文件内容
string content = File.ReadAllText(path);
Console.WriteLine("File content: " + content);
}
catch (FileNotFoundException ex)
{
// 文件不存在时,捕获异常并记录错误信息
Console.WriteLine("找不到文件");
throw; // 重新抛出原始异常
}
catch (IOException ex)
{
// 其他I/O错误时,捕获异常并记录错误信息
Console.WriteLine("发生了一个I/O错误");
throw; // 重新抛出原始异常
}
catch (UnauthorizedAccessException ex)
{
// 当没有足够权限访问文件时,捕获异常并记录错误信息
Console.WriteLine("没有足够权限访问文件");
throw; // 重新抛出原始异常
}
}
}
}
调用:
using DjConsoleApp0527;
NofilesFound files=new NofilesFound();
files.Nofiles("D:\\test");
标签:arr,Console,C#,运算符,int,WriteLine,集合,using From: https://blog.csdn.net/qq_63873127/article/details/140206098如果想了解关于异常的知识点,请点击我!