首页 > 编程语言 >C#学习—集合与运算符

C#学习—集合与运算符

时间:2024-07-05 16:31:23浏览次数:22  
标签:arr Console C# 运算符 int WriteLine 集合 using

目录

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

2.  计算遍历目录的耗时

        2.1 使用Stopwatch        

        2.2 使用DateTime和DateTime.Now或DateTime.UtcNow

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

        3.1算数运算符

        3.2 关系运算符

        3.3 逻辑运算符

        3.4 位运算符

        3.5 赋值运算符

4. 三目表达式举例

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

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

7. 写个冒泡排序 

8. 写个九九乘法表 

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




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

思路:

  1. 定义命名空间:需要定义你的代码将存在于哪个命名空间中

  2. 创建类:创建一个类,比如DjTools,这个类将包含你的打印工具方法。

  3. 定义泛型方法:在这个类中,定义一个泛型方法println。这个方法将接受一个IEnumerable<T>类型的参数,其中T是类型参数,代表任何类型。

  4. 实现方法体:在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 使用DateTimeDateTime.NowDateTime.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 关系运算符

                系运算符用于比较两个值,返回一个布尔结果(truefalse)

运算符描述
==相等
!=不等于
<小于
>大于
<=小于或等于
>=大于或等于
        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. 优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件

  1. 有括号先括号:任何包含在圆括号内的表达式都会被优先计算,这允许你改变默认的运算顺序。例如:在表达式 (2 + 3) * 4 中,加法会先于乘法执行。

  2. 后乘除再加减:在没有括号干预的情况下,乘法和除法的优先级高于加法和减法。例如:在表达式 2 * 3 + 4 / 2 中,乘法和除法会先执行,之后才是加法。

  3. 然后位移再关系:位移运算符(左移<<和右移>>)的优先级高于关系运算符(如<><=>===!=)。这意味着在表达式 a << 2 > b 中,位移操作会先于关系比较执行。

  4. 逻辑完后再条件:逻辑运算符(&&||!)的优先级低于位运算符和关系运算符,但高于条件运算符(三目运算符? :)。例如:在表达式 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

相关文章

  • C#的学习基础篇(3)——字符串的常见方法
    目录1.字符串的常见方法    1.1Format         1.2IsNullOrEmpty        1.3IsNullOrWhiteSpace        1.4Equals        1.5Contains        1.6Length        1.7 Substring        1.8......
  • 集合
    前言保存多个数据使用数组的不足之处:长度开始时必须指定,指定后不能修改保存的数据必须为同一类型的元素使用数组进行增加/删除元素的时比较繁琐集合概念可以动态保存任意多个对象提供一系列方便操作对象的方法:add、remove、set、get等使用集合添加,删除新元素更简洁集......
  • C#的学习(4)
    1.整数转换,整数和字符串,字符串和整数之间的转换怎么实现?        1.1整数转字符串    intn=123;//第一种方式:任何类型和字符串连接,结果都是字符串Console.WriteLine(""+n);//第二种方式:通过Convert.ToString()方法进行转换Console.WriteLine(C......
  • 海康SDK报错Structure.getFieldOrder()
    就是你调用的这个结构体以及其引用的其他结构体,可能没有getFieldOrder()的方法,你只要按照顺序把他填上去就好了。比如publicstaticclassNET_DVR_TIMEextendsStructure{//校时结构参数publicintdwYear;//年publicintdwMonth;//月......
  • FAILED: cpu_adam.so /usr/bin/ld: cannot find -lcurand collect2: error: ld retur
    FAILED:cpu_adam.so c++cpu_adam.ocpu_adam_impl.o-shared-lcurand-L/home/deeplp/anaconda3/envs/minicpm/lib/python3.10/site-packages/torch/lib-lc10-ltorch_cpu-ltorch-ltorch_python-ocpu_adam.so/usr/bin/ld:cannotfind-lcurandcollect2:error:ld......
  • 虚拟ECU:纯电动汽车发展下的新选择
    ​人类文明的进步是一个不断自我否定、自我超越的过程。21世纪以来,随着科技进步和经济社会发展,能源和交通系统已从独立于自然环境的孤立系统,转变为与自然、技术、社会深度耦合的复杂系统。为实现可持续发展和应对气候变化,世界各国都在积极推进能源结构调整和技术创新,以确保在未来......
  • Python多线程-线程池ThreadPoolExecutor
    1.线程池不是线程数量越多,程序的执行效率就越快。线程也是一个对象,是需要占用资源的,线程数量过多的话肯定会消耗过多的资源,同时线程间的上下文切换也是一笔不小的开销,所以有时候开辟过多的线程不但不会提高程序的执行效率,反而会适得其反使程序变慢,得不偿失。为了防止无尽的线程......
  • 外挂级OCR神器:免费文档解析、表格识别、手写识别、古籍识别、PDF转Word
    TextInTools是一款免费的在线OCR工具,支持快速准确的文字和表格识别,手写、古籍识别,提供PDF转Markdown大模型辅助工具,同时支持PDF、WORD、EXCEL、JPG、PPT等各类格式文件的转化。TextInTools特点免费:所有产品提供每日200页免费额度,覆盖日常使用需求。方便:无需下载安装,PC端......
  • mainCRTStartup WinMainCRTStartup
    assumecs:codesg,ds:datas;str字符必须是13位,所以中间加了两个空格,网上很多代码也避开了这个问题,都是通过加空格,拼写错误,反正加个占位符;否则会输出一堆乱码,实在想不明白是什么原因datassegmentstrdb'HelloWorld!','$'datasendscodesgsegmentmovax,datas......
  • const修饰指针变量和assert断言
    一.const修饰指针变量一般来说,const修饰指针变量,可以放在*的左边,也可以放在*的右边,两个表示方法的意义是不一样的。1.代码1——测试无const修饰的情况voidtest1(){ intn=10; intm=20; int*p=&n; *p=20;//1 p=&m;//2}在这个代码中1和2所在的语句均可以......