C#基础2024.07.05

目录

1.实现通用打印泛型类,可以打印各个集合中的值,方便调试。

2.计算遍历目录的耗时。

计算耗时的方法(推荐使用Stopwatch):

TimeSpan和Stopwatch的区别:

代码实现

3.有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符。

算术运算符

关系运算符

逻辑运算符

位运算符

赋值运算符

4.三目表达式举例 

5.优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件。

6.写个例子展示break、continue、ruturn的区别

7.写个冒泡排序

8.写个九九乘法表

9.实现文件找不到抛出异常


1.实现通用打印泛型类,可以打印各个集合中的值,方便调试。

打印泛型类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DJConsoleProject
{
    //自定义工具类
    internal class DJUtils
    {
        //通用的打印
        //必须继承IEnumerable接口的类,满足它才能进行迭代
        //泛型方法
        public static 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);  //输出:1 2 3

LinkedList<string> list = new LinkedList<string>();
list.AddFirst("刘备");
list.AddLast("关羽");
list.AddLast("张飞");

DJUtils.println(list);  //输出:刘备 关羽 张飞


2.计算遍历目录的耗时。

计算耗时的方法(推荐使用Stopwatch):

(1)使用两个DateTime的now方法相减

(2)TimeSpan

  • TimeSpan 是一个结构体(struct),用于表示时间间隔或持续时间。它可以存储以天、小时、分钟、秒以及毫秒为单位的时间长度。TimeSpan 不代表任何特定时刻,而只表示两个时刻之间的差异。它通常用于计算两个日期或时间点之间的差值,或者用于添加或减去一个时间间隔到某个日期上。

(3)Stopwatch

  • Stopwatch 是一个类,位于 System.Diagnostics 命名空间中,用于高精度地测量一小段代码的执行时间。它能够提供比 TimeSpan 更精确的测量,因为它使用了操作系统提供的高分辨率性能计数器。Stopwatch 可以启动、停止、重置,并读取经过的时间,这使得它非常适合用于基准测试或性能分析。

TimeSpan和Stopwatch的区别:

  • TimeSpan 是用来表示持续时间的长度,而 Stopwatch 是用来测量实际经过的时间,通常用于性能监控。两者结合使用时,你可能会先用 Stopwatch 测量一段代码的执行时间,然后将这个时间作为 TimeSpan 对象进行存储、显示或进一步的计算。

代码实现

  • 在这个例子中,TraverseDirectory 方法会递归地遍历指定目录及其所有子目录。StopwatchStartStop 方法分别在遍历开始和结束时被调用,从而可以准确地测量出整个遍历过程所消耗的时间。
using System;
using System.Diagnostics;
using System.IO;

class Program
{
    static void Main()
    {
        string path = @"D:"; // 指定要遍历的目录路径

        // 创建一个Stopwatch实例
        Stopwatch stopwatch = new Stopwatch();

        // 开始计时
        stopwatch.Start();

        // 使用递归方法遍历目录
        TraverseDirectory(path);

        // 停止计时
        stopwatch.Stop();

        // 输出所花费的时间
        Console.WriteLine("耗时:{0}毫秒", stopwatch.ElapsedMilliseconds);
    }

    static void TraverseDirectory(string directoryPath)
    {
        try
        {
            // 获取当前目录中的所有文件
            foreach (var file in Directory.GetFiles(directoryPath))
            {
                // 在这里你可以对文件做任何操作
            }

            // 获取当前目录中的所有子目录
            foreach (var subDir in Directory.GetDirectories(directoryPath))
            {
                // 递归调用自身以遍历子目录
                TraverseDirectory(subDir);
            }
        }
        catch (Exception ex)
        {
            // 处理任何可能出现的异常
            Console.WriteLine($"无法访问目录 {directoryPath}: {ex.Message}");
        }
    }
}


3.有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符。

算术运算符

算术运算符用于执行基本的数学运算,具体包括:

  • + 加法:将两个数值相加。
  • - 减法:从一个数值中减去另一个数值。
  • * 乘法:两个数值相乘。
  • / 除法:一个数值除以另一个数值,如果操作数是整型,结果将向下取整。
  • % 模运算(取余):返回除法的余数。
  • ++ 自增:将变量的值增加1。可以是前置(++x)或后置(x++)。
  • -- 自减:将变量的值减少1。同样有前置(--x)和后置(x--)形式。

关系运算符

关系运算符用于比较两个值,结果为布尔值 truefalse

  • == 等于:检查两个值是否相等。
  • != 不等于:检查两个值是否不相等。
  • < 小于:检查左边的值是否小于右边的值。
  • > 大于:检查左边的值是否大于右边的值。
  • <= 小于等于:检查左边的值是否小于或等于右边的值。
  • >= 大于等于:检查左边的值是否大于或等于右边的值。

逻辑运算符

逻辑运算符用于组合布尔表达式,结果也是布尔值:

  • && 逻辑与:如果两个操作数都是 true,结果为 true
  • || 逻辑或:如果至少有一个操作数为 true,结果为 true
  • ! 逻辑非:反转操作数的布尔值,true 变为 false,反之亦然。

位运算符

位运算符用于按位操作整数的二进制表示:

  • ~ 按位非:反转一个整数的每一位(0变1,1变0)。
  • & 按位与:当两个对应的二进制位都是1时,结果位为1。
  • | 按位或:当两个对应的二进制位中至少有一个是1时,结果位为1。
  • ^ 按位异或:当两个对应的二进制位不同时,结果位为1。
  • << 左移:将一个二进制数的所有位向左移动指定的位数,高位丢失,低位补零。
  • >> 右移:将一个二进制数的所有位向右移动指定的位数,对于无符号数和正数,高位补0;对于负数,高位补1(算术右移)。

赋值运算符

赋值运算符用于将一个值赋给变量:

  • = 简单赋值:将右边的值赋给左边的变量。
  • += 加法赋值:将左边的变量与右边的值相加,结果再赋给左边的变量。
  • -= 减法赋值:从左边的变量中减去右边的值,结果再赋给左边的变量。
  • *= 乘法赋值:将左边的变量与右边的值相乘,结果再赋给左边的变量。
  • /= 除法赋值:将左边的变量除以右边的值,结果再赋给左边的变量。
  • %= 模运算赋值:左边的变量与右边的值取模,结果再赋给左边的变量。
  • &= 按位与赋值:将左边的变量与右边的值进行按位与操作,结果再赋给左边的变量。
  • |= 按位或赋值:将左边的变量与右边的值进行按位或操作,结果再赋给左边的变量。
  • ^= 按位异或赋值:将左边的变量与右边的值进行按位异或操作,结果再赋给左边的变量。
  • <<= 左移赋值:将左边的变量左移右边指定的位数,结果再赋给左边的变量。
  • >>= 右移赋值:将左边的变量右移右边指定的位数,结果再赋给左边的变量。


4.三目表达式举例 

a>b? a : b

解释:判断a是否大于b,如果a>b,返回a,如果a<=b,则返回b(返回较大的那个数)

int a = 10, b = 20;
int max = (a > b) ? a : b; // 如果a大于b,max等于a,否则max等于b
Console.WriteLine("The maximum value is: " + max);


5.优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件。

以下是C#中运算符的优先级列表,从最高到最低排列:

  1. 组内运算符

    • () 表示函数调用或括号表达式的分组。
    • [] 数组索引。
    • . 成员访问。
    • -> 结构指针成员访问(主要用于指针)。
  2. 后缀运算符

    • ++ 后置自增。
    • -- 后置自减。
  3. 一元运算符

    • ++ 前置自增。
    • -- 前置自减。
    • + 一元正号。
    • - 一元负号。
    • ! 逻辑非。
    • ~ 按位非。
    • typeof 类型查询。
    • sizeof 类型大小查询。
    • * 取指针所指内容(解引用)。
    • & 取地址。
    • new 对象或数组实例化。
  4. 乘除模运算符

    • * 乘法。
    • / 除法。
    • % 取模。
  5. 加减运算符

    • + 加法。
    • - 减法。
    • + 字符串连接(仅字符串)。
    • - 字符串连接的减法运算符重载(一些框架中可用)。
  6. 位移运算符

    • << 左移。
    • >> 右移。
  7. 比较运算符

    • < 小于。
    • > 大于。
    • <= 小于等于。
    • >= 大于等于。
    • == 等于。
    • != 不等于。
  8. 按位与运算符

    • & 按位与。
  9. 按位异或运算符

    • ^ 按位异或。
  10. 按位或运算符

    • | 按位或。
  11. 逻辑与运算符

    • && 逻辑与(短路与)。
  12. 逻辑或运算符

    • || 逻辑或(短路或)。
  13. 条件运算符(三元运算符)

    • ?: 条件运算符。
  14. 赋值运算符

    • = 简单赋值。
    • *= 乘法赋值。
    • /= 除法赋值。
    • %= 取模赋值。
    • += 加法赋值。
    • -= 减法赋值。
    • <<= 左移赋值。
    • >>= 右移赋值。
    • &= 按位与赋值。
    • ^= 按位异或赋值。
    • |= 按位或赋值。
  15. 逗号运算符

    • , 逗号运算符,用于序列表达式。

注意,在同一优先级水平上的运算符按照从左到右的顺序进行计算,除非另有说明(例如,赋值运算符是从右到左)。使用括号可以显式地改变运算符的优先级,使某些表达式先于其他表达式计算。


6.写个例子展示break、continue、ruturn的区别

using System;

class Program
{
    static void Main()
    {
        // 使用 break 跳出循环
        Console.WriteLine("Break example:");
        for (int i = 0; i < 10; i++)
        {
            if (i == 5)
            {
                //当i=5时,跳出循环体,执行循环体之后的下一条语句
                break;
            }
            Console.Write(i + " ");  //输出:0 1 2 3 4
        }
        Console.WriteLine();

        // 使用 continue 忽略循环中的当前迭代
        Console.WriteLine("Continue example:");
        for (int i = 0; i < 10; i++)
        {
            if (i % 2 == 0)
            {
                //当i为偶数时,跳出当前循环,进行下一轮循环
                //也就是说,只在控制台打印出奇数
                continue;
            }
            Console.Write(i + " ");  //输出:1 3 5 7 9
        }
        Console.WriteLine();

        // 使用 return 从方法中返回
        Console.WriteLine("Return example:");
        int result = ReturnExample();
        Console.WriteLine("函数的返回值:"+result);   //输出:6
    }

    static int ReturnExample()
    {
        for (int i = 0; i < 10; i++)
        {
            if (i == 3)
            {
                //当i=3时,直接结束该方法,且该方法的返回值为6
                Console.WriteLine();
                return i * 2; // 返回i的两倍作为结果
            }
            Console.Write(i + " "); //输出:0 1 2
        }
        return -1; // 如果没有提前return,则在循环结束后返回-1
    }
}


7.写个冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法,其基本思想是通过重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素,也就是说该数列已经排序完成。

以下是冒泡排序的具体步骤:

  1. 比较相邻的元素:如果第一个比第二个大(升序排序的情况下),就交换它们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序的一个关键特性是它是一个稳定的排序算法,这意味着相等的元素保持它们原来的顺序。冒泡排序的时间复杂度在最好情况下为 O(n),当输入数组已经是排序好的时候;在最坏和平均情况下,时间复杂度为 O(n^2)。空间复杂度为 O(1),因为它是一个原地排序算法,不需要额外的存储空间。

//冒泡排序
static void BubbleSort(int[] a)
{
    for(int i = 0; i < a.Length; i++)
    {
        bool swaped = false;
        for(int j = i; j < a.Length; j++)  
        {
            if (a[j] > a[j+1]) 
            {
                int tmp = a[j]; 
                a[j] = a[j+1]; 
                a[j + 1] = tmp;
                swaped = true;
            }
        }
        //如果该遍历过程中没有发生位置交换,说明该数组已经排序完成,可以直接退出循环
        if (!swaped) 
        {
            break;
        }
    }
}

int[] a = { 1, 9, 7, 8, 3, 2, 5, 6, 4, 0 };
BubbleSort(a);
for (int i = 0; i < a.Length; i++)
{
    Console.Write(a[i]+" ");  //输出:0 1 2 3 4 5 6 7 8 9
}


8.写个九九乘法表

代码:

for (int i = 1; i < 10; i++)
{
    for (int j = 1; j <= i; j++)
    {
        Console.Write("{0}*{1}={2}\t", j, i, i * j);
    }
    Console.WriteLine();
}

输出:


9.实现文件找不到抛出异常

using System;
using System.IO;

class FileCheck
{
    static void Main()
    {
        string filePath = @"C:\path\to\your\file.txt";

        // 检查文件是否存在
        if (!File.Exists(filePath))
        {
            // 文件不存在,抛出FileNotFoundException
            throw new FileNotFoundException("指定的文件未找到。", filePath);
        }

        // 文件存在,继续执行其他操作...
        Console.WriteLine("文件存在,可以进行后续处理。");
    }
}

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值