1. 实现通用打印泛型类,可以打印各个集合中的值,方便调试。
namespace ConsoleApp1 { class DJUtils { static public void println<T>(IEnumerable<T> collection) { foreach(T item in collection) { Console.Write(item+ " "); } Console.WriteLine(); } } }
//调用测试 using ConsoleApp1; List<string> list = new List<string> { "陈晨", "陈川" }; DJUtils.println(list);
2. 计算遍历目录的耗时。
using System; using System.Diagnostics; using System.IO; class TraverseAndMeasureTime { static void Main() { string directoryPath = @"D:\BaiduNetdiskDownload\dj0527"; // 更改为你的目录路径 Stopwatch stopwatch = new Stopwatch(); // 开始计时 stopwatch.Start(); // 遍历目录并处理文件 TraverseDirectory(directoryPath); // 停止计时 stopwatch.Stop(); // 输出耗时 TimeSpan elapsed = stopwatch.Elapsed; Console.WriteLine($"遍历并处理文件耗时:{elapsed.TotalMilliseconds} 毫秒"); } private static void TraverseDirectory(string directoryPath) { // 检查目录是否存在 if (!Directory.Exists(directoryPath)) { Console.WriteLine("指定的目录不存在。"); return; } // 获取目录中的所有文件 string[] files = Directory.GetFiles(directoryPath); foreach (string filePath in files) { FileInfo fileInfo = new FileInfo(filePath); // 在这里处理每个文件,例如打印文件名或读取文件内容 Console.WriteLine($"正在处理文件:{fileInfo.Name}"); // 你可以添加更多的处理逻辑,例如读取文件内容等 } } }
3. 有哪些算术运算符,有哪些关系运算符,有哪些逻辑运算符,有哪些位运算符,有哪些赋值运算符。
运算符类型 运算符 描述 算术运算符 + 加法 - 减法 * 乘法 / 除法 % 取模(求余数) ++ 前置或后置自增(增加1) -- 前置或后置自减(减少1) 关系运算符 < 小于 <= 小于等于 > 大于 >= 大于等于 == 等于 != 不等于 逻辑运算符 && 逻辑与(AND) || 逻辑或(OR) ! 逻辑非(NOT) 位运算符 & 位与 | 位或 ^ 位异或 ~ 位非 << 左移 >> 右移 赋值运算符 = 简单赋值 += 加法赋值 -= 减法赋值 *= 乘法赋值 /= 除法赋值 %= 取模赋值 &= 位与赋值 |= 位或赋值 ^= 位异或赋值 <<= 左移赋值 >>= 右移赋值
4. 三目表达式举例三目表达式,也称为条件运算符,是在许多编程语言中提供的一种紧凑的if-else语句的替代方式。它接受三个参数:一个布尔表达式,一个当表达式为真时返回的值,以及一个当表达式为假时返回的值。其基本语法如下:
条件 ? 值1 : 值2;
如果
条件
为真,则整个表达式的值为值1
;如果条件
为假,则值为值2
。以下是一些使用C#编写的三目表达式的示例:
示例1:基于年龄判断是否成年
int age = 17; string status = (age >= 18) ? "成年" : "未成年"; Console.WriteLine(status); // 输出 "未成年"
示例2:确定两个数中的最大值
int a = 10; int b = 20; int max = (a > b) ? a : b; Console.WriteLine(max); // 输出 20
示例3:根据成绩给出字母等级
int score = 85; string grade = (score >= 90) ? "A" : (score >= 80) ? "B" : (score >= 70) ? "C" : (score >= 60) ? "D" : "F"; Console.WriteLine(grade); // 输出 "B"
示例4:计算折扣价格
double price = 100.0; double discountRate = 0.1; double discountedPrice = (price > 50.0) ? price * (1 - discountRate) : price; Console.WriteLine(discountedPrice); // 输出 90.0
示例5:检查空值并提供默认值
string name = null; string defaultName = name ?? "匿名用户"; Console.WriteLine(defaultName); // 输出 "匿名用户"
请注意,在最后一个示例中,
??
运算符是一个特殊的三目运算符,用于在 C# 中处理 null 值。如果左侧的操作数为 null,则返回右侧的操作数;否则,返回左侧的操作数。这是 null 合并运算符的一个应用,可以看作是三目运算符的一种变形。
5. 优先级口诀:有括号先括号,后乘除再加减,然后位移再关系,逻辑完后再条件。
有括号先括号:
- 圆括号
()
、方括号[]
和花括号{}
内的表达式优先计算。括号可以嵌套,最内层的括号最先计算。后乘除再加减:
- 乘法
*
和除法/
的优先级高于加法+
和减法-
。- 在同一优先级内,从左到右计算。
然后位移再关系:
- 位移运算符
<<
和>>
的优先级高于关系运算符<
,<=
,>
,>=
,==
,!=
。- 关系运算符用于比较,决定两个值之间的大小或相等性。
逻辑完后再条件:
- 逻辑运算符
&&
,||
的优先级低于关系运算符,高于条件(三目)运算符? :
。- 条件运算符用于基于条件选择两个可能的值之一。
赋值最后:
- 赋值运算符
=
和复合赋值运算符+=
,-=
,*=
,/=
, 等的优先级是最低的。
6. 写个例子展示break、continue、ruturn的区别
break
- 用途:
break
语句用于立即退出最内层的循环(for
、while
或do-while
)或switch
语句。- 效果:当
break
被执行时,程序控制将立即跳转到循环或switch
语句之后的第一条语句。- 示例:假设我们要寻找数组中的第一个负数,一旦找到,就停止搜索并报告该数。
using System; public class BreakDemo { public static void Main() { int[] numbers = { 1, 3, 5, -2, 8, 10, -1 }; foreach (int number in numbers) { if (number < 0) { Console.WriteLine("找到了第一个负数:" + number); break; // 一旦找到第一个负数,就退出循环 } } } }
continue
- 用途:
continue
语句用于跳过循环体中当前迭代剩余的部分,直接开始下一次迭代。- 效果:当
continue
被执行时,循环中的任何后续代码都不会运行,而是直接跳转到循环的开始,进行条件检查或更新循环变量(对于for
循环)。- 示例:假设我们要打印一个数组中的所有正数,忽略所有的负数。
using System; public class ContinueDemo { public static void Main() { int[] numbers = { 1, -3, 5, -2, 8, 10, -1 }; foreach (int number in numbers) { if (number < 0) { continue; // 忽略负数,跳过当前迭代 } Console.WriteLine(number); } } }
return
- 用途:
return
语句用于从一个函数或方法中返回,并可选择性地带回一个值给调用者。- 效果:
return
语句不仅结束当前函数的执行,还可以向调用者传递一个值。如果没有值跟在return
后面,那么函数将返回其声明的默认返回类型(例如,在C#中,如果函数声明为void
,则不返回任何值)。- 示例:假设我们有一个方法,用来查找数组中的最小值,一旦找到就立即返回。
using System; public class ContinueDemo { public static void Main() { int[] numbers = { 1, -3, 5, -2, 8, 10, -1 }; foreach (int number in numbers) { if (number < 0) { continue; // 忽略负数,跳过当前迭代 } Console.WriteLine(number); } } }
7. 写个冒泡排序
冒泡排序原理
冒泡排序的基本思想是通过不断地比较相邻的两个元素,如果它们的顺序错误就把它们交换过来,这样较大的值会逐渐“浮”到数组的末尾,就像水中的气泡上升一样,故名冒泡排序。
工作过程
冒泡排序的过程可以分为多个“趟”(pass)。每一趟都会将当前未排序部分的最大值冒泡到数组的末尾。以下是具体步骤:
初始化:假设有一个待排序的数组。
第一趟排序:
- 比较第1个和第2个元素,如果第1个比第2个大,就交换它们的位置。
- 接着比较第2个和第3个元素,继续这个过程直到比较最后一个元素前的一个元素。
- 结束时,最大的元素会被放置在数组的最后位置。
第二趟排序:
- 重复上述过程,但这次忽略已知最大且已排序的最后一个元素。
- 这次比较和交换会使第二大的元素冒泡到最后剩下的位置。
重复过程:重复上述过程,每次忽略已排序的元素,直到整个数组都排序完毕。
优化
在传统的冒泡排序中,每一趟都会遍历整个未排序部分。但是,如果在一趟遍历过程中没有发生任何交换,这意味着数组已经是有序的,没有必要再进行更多的遍历。因此,可以通过设置一个标志位来优化冒泡排序,如果在某趟遍历中没有发生交换,就可以提前终止排序。
时间复杂度
冒泡排序的时间复杂度分析如下:
- 最好情况:如果输入数组已经是排序好的,算法只需要进行一次遍历来确认这一点,时间复杂度为O(n)。
- 最坏情况:如果输入数组是逆序的,那么每一对元素都需要交换,时间复杂度为O(n^2)。
- 平均情况:时间复杂度也为O(n^2)。
总结
冒泡排序是一种简单直观的排序算法,适用于小型数据集或教学目的,但在处理大规模数据时效率较低,因为其时间复杂度较高。不过,通过引入标志位的优化措施,可以在数据接近有序的情况下显著提高性能。
源码
using System; public class BubbleSortExample { public static void Main() { int[] array = { 64, 34, 25, 12, 22, 11, 90 }; BubbleSort(array); Console.WriteLine("Sorted array is:"); PrintArray(array); } static void BubbleSort(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]) { // Swap arr[j] and arr[j + 1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; swapped = true; } } // If no two elements were swapped by inner loop, then break if (!swapped) break; } } static void PrintArray(int[] arr) { foreach (int element in arr) { Console.Write(element + " "); } Console.WriteLine(); } }
8. 写个九九乘法表using System; class MultiplicationTable { static void Main() { // 外层循环控制行 for (int i = 1; i <= 9; i++) { // 内层循环控制列 for (int j = 1; j <= i; j++) { Console.Write($"{j} * {i} = {j * i}\t"); // 输出乘法表达式和结果,\t用于添加制表符空格 } Console.WriteLine(); // 每完成一行输出后换行 } } }
![]()
9. 实现文件找不到抛出异常
using System;
using System.IO;
class FileReadingExample
{
public static string ReadFileContent(string filePath)
{
try
{
return File.ReadAllText(filePath);
}
catch (FileNotFoundException ex)
{
// 抛出一个包含自定义错误消息的新异常
throw new ApplicationException($"文件 {filePath} 未找到。", ex);
}
}
static void Main()
{
//string filePath = "C:\\Users\\K\\Desktop\\nonexistent_file.txt";
string filePath = "C:\\nonexistent_file.txt";
try
{
string content = ReadFileContent(filePath);
Console.WriteLine(content);
}
catch (ApplicationException ex)
{
Console.WriteLine(ex.Message);
}
}
}
未找到文件抛出异常