1、字符串的常见方法
- Format:用于字符串格式化,通过占位符和参数匹配来构建字符串。
string name = "Alice"; string greeting = string.Format("Hello, {0}!", name); Console.WriteLine(greeting); // 输出: Hello, Alice!
- IsNullOrEmpty/IsNullOrWhiteSpace:用于检查字符串是否为空或仅由空白字符组成。
string username = " "; string password = "123456"; if (string.IsNullOrWhiteSpace(username)) { throw new ArgumentNullException("username is null"); } else { if (string.IsNullOrEmpty(password)) { throw new ArgumentNullException("password is null"); } } Console.WriteLine("登录成功!");
- Equals:比较字符串,支持忽略大小写的比较。
string str = "Hello"; //c#大小写敏感,忽略大小写 //if(str.ToLower() == "hello") //if(str.Equals("hello")) if(str.ToLower().Equals("hello")) { Console.WriteLine("相等"); } else { Console.WriteLine("不相等"); }
- Contains:判断一个字符串是否包含另一个字符串。
string str = "Hello world"; if (str.Contains("Hello")) { Console.WriteLine("1"); } else { Console.WriteLine("0"); }
- Length:获取字符串的长度。
string str = "Hello world"; Console.WriteLine(str.Length);
- Substring:从字符串中抽取子串,可以指定起始位置和长度。
string str = "Hello World. 你好"; Console.WriteLine(str.Substring(0));//截取全部字符 Console.WriteLine(str.Substring(0, 5));//从一个字符开始截取5个字符 //开发时,不用精确去先算好,大概猜一个位置,不正确了再修改 Console.WriteLine(str.Substring(6, 5));//从第七个字符开始(n+1) //截取到最后 Console.WriteLine(str.Substring(13)); Console.WriteLine(str.Substring(str.Length - 2));
- IndexOf/LastIndexOf:分别查找子字符串首次出现的位置和最后一次出现的位置
//为什么斜杠要写两个,第一个斜杠是语言转义字符,第二个斜杠真正斜杠字符 string path = "C:\\课:程\\03-CSharp\\day04\\课堂笔记.docx"; Console.WriteLine(path); Console.WriteLine( path.IndexOf(":") ); Console.WriteLine( path.LastIndexOf(":") );
- StartsWith/EndsWith:判断字符串是否以指定子串开头或结尾。
string path = "C:\\课程\\03-CSharp\\day04\\课堂笔记.docx"; if (path.StartsWith("C:\\课程")) { Console.WriteLine("课程文件"); } string extName = path.Substring(path.LastIndexOf(".")); Console.WriteLine("扩展名:{0}", extName); if (path.EndsWith(".docx")) { Console.WriteLine("word文档"); } else if (path.EndsWith(".jpg")) { Console.WriteLine("图片文档"); } else if (path.EndsWith(".mp4")) { Console.WriteLine("电影文档"); }
- Remove:从字符串中移除一部分,常用于移除后缀。
string path = "C:\\课:程\\03-CSharp\\day04\\课堂笔记.docx"; Console.WriteLine(path.Remove(path.LastIndexOf(".")));
- Reverse:反转字符串
string str = "以身为则"; Console.WriteLine(str.Reverse().ToArray());
- Trim/Replace:去除字符串两端空白或替换特定字符。
string str = " 以身 为则 "; Console.WriteLine(str); Console.WriteLine(str.Trim());//去除两端空格 Console.WriteLine(str.Replace(" ", ""));// 将所有空格替换为空字符串 Console.WriteLine(str.Replace(' ', '-'));// 将所有空格替换为破折号
- Concat:连接字符串,支持大小驼峰命名法的转换。
string str = "helloWorld"; string first = str.Substring(0, 1); //首字母 //大驼峰:HelloWorld Console.WriteLine(first.ToUpper() + str.Substring(1)); Console.WriteLine(string.Concat(first.ToUpper(), str.Substring(1))); //小驼峰:helloWorld Console.WriteLine(first.ToLower() + str.Substring(1)); Console.WriteLine(string.Concat(first.ToLower(), str.Substring(1)));
- Join/Split:将字符串数组连接为单个字符串,或将字符串分割为数组。
string[] names = { "xiaomi", "huawei" }; string str = ""; //转换成一个字符串 for (int i = 0; i < names.Length; i++) { str += string.Concat(names[i], " "); } Console.WriteLine(str); //第一个参数是分隔符,第二参数数组 Console.WriteLine(string.Join(" ", names)); string citystr = "北京,上海,深圳,广州,杭州"; //变成一个数组,获取数组的每个元素 string[] cities = citystr.Split(","); foreach (string s in cities) { Console.WriteLine(s); }
2、实现身份证的解析
定义类与方法
1class IDCardParser
2{
3 public static void ParseIDCard(string idCardNumber)
4 {
5 // ...
6 }
7}
这里定义了一个名为IDCardParser
的类,它包含一个静态方法ParseIDCard
。静态方法意味着可以直接通过类名调用,而无需实例化类的对象。此方法接受一个字符串参数idCardNumber
,即待解析的身份证号码。
验证身份证号码长度
1if (idCardNumber.Length != 18)
2{
3 Console.WriteLine("身份证号码长度不正确!");
4 return;
5}
首先,代码检查输入的身份证号码是否恰好为18位长。如果不是,程序将输出错误信息并立即终止方法的执行,不再进行后续的解析步骤。
解析地址码
1string addressCode = idCardNumber.Substring(0, 6);
2Console.WriteLine($"地址码: {addressCode}");
接下来,使用Substring
方法从身份证号码中提取前6位字符,这部分称为地址码,用于标识身份证持有者的户籍所在地。提取后,使用Console.WriteLine
方法将地址码输出到控制台。
解析出生日期
1string birthDateStr = idCardNumber.Substring(6, 8);
2DateTime birthDate;
3if (DateTime.TryParseExact(birthDateStr, "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out birthDate))
4{
5 Console.WriteLine($"出生日期: {birthDate.ToString("yyyy-MM-dd")}");
6}
从身份证号码中提取第7位到第14位字符,这部分代表出生日期,格式为yyyyMMdd
。使用DateTime.TryParseExact
方法尝试将这8位数字解析为一个DateTime
对象。如果解析成功,将结果转换为“年-月-日”的格式并输出到控制台。
解析性别
1int orderCode = int.Parse(idCardNumber.Substring(14, 3));
2string gender = orderCode % 2 == 0 ? "女" : "男";
3Console.WriteLine($"性别: {gender}");
提取身份证号码中第15位到第17位的数字,这部分称为顺序码,用于区分同年同月同日出生的人。通过检查顺序码的最后一位是奇数还是偶数来判断性别,奇数代表男性,偶数代表女性,然后将结果输出到控制台。
解析校验码
1string checkCode = idCardNumber.Substring(17, 1);
2Console.WriteLine($"校验码: {checkCode}");
最后,从身份证号码中提取第18位字符,即校验码,用于验证身份证号码的正确性。直接输出校验码到控制台。
主函数与用户输入
1static void Main()
2{
3 Console.Write("请输入您的身份证号码: ");
4 string idCardNumber = Console.ReadLine();
5
6 ParseIDCard(idCardNumber);
7}
在Main
函数中,程序提示用户输入身份证号码,并使用Console.ReadLine()
方法读取用户输入的字符串。之后,调用ParseIDCard
方法,将用户输入的身份证号码作为参数传递进去,从而执行整个解析过程
源码:
using System;
class IDCardParser
{
public static void ParseIDCard(string idCardNumber)
{
if (idCardNumber.Length != 18)
{
Console.WriteLine("身份证号码长度不正确!");
return;
}
// 地址码
string addressCode = idCardNumber.Substring(0, 6);
Console.WriteLine($"地址码: {addressCode}");
// 出生日期码
string birthDateStr = idCardNumber.Substring(6, 8);
DateTime birthDate;
if (DateTime.TryParseExact(birthDateStr, "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out birthDate))
{
Console.WriteLine($"出生日期: {birthDate.ToString("yyyy-MM-dd")}");
}
// 性别
int orderCode = int.Parse(idCardNumber.Substring(14, 3));
string gender = orderCode % 2 == 0 ? "女" : "男";
Console.WriteLine($"性别: {gender}");
// 校验码
string checkCode = idCardNumber.Substring(17, 1);
Console.WriteLine($"校验码: {checkCode}");
}
static void Main()
{
Console.Write("请输入您的身份证号码: ");
string idCardNumber = Console.ReadLine();
ParseIDCard(idCardNumber);
}
}
运行结果:
3、遍历磁盘,列出目录和文件、统计文件个数,统计不同类型(后缀)的文件个数
定义类和方法
class DirectoryTraverser
{
public static void TraverseDirectory(string path)
{
// ...
}
}
这里定义了一个名为DirectoryTraverser
的类,它包含一个静态方法TraverseDirectory
,该方法接受一个字符串参数path
,代表要遍历的目录路径。
遍历目录和统计文件
int totalFiles = 0;
Dictionary<string, int> fileExtensions = new Dictionary<string, int>();
初始化两个变量:totalFiles
用于统计总的文件数量,fileExtensions
是一个字典,用于存储每种文件扩展名及其对应的文件数量。
foreach (var directory in Directory.EnumerateDirectories(path))
{
// ...
}
使用Directory.EnumerateDirectories
方法遍历指定目录下的所有子目录。这个方法返回一个枚举器,可以迭代目录树中的所有子目录
foreach (var file in Directory.EnumerateFiles(directory))
{
// ...
}
在每个子目录中,使用Directory.EnumerateFiles
方法列出所有的文件。同样,这返回一个枚举器,可以迭代目录中的所有文件。
获取文件信息和统计
FileInfo fileInfo = new FileInfo(file);
totalFiles++;
string extension = fileInfo.Extension.ToLower();
if (!fileExtensions.ContainsKey(extension))
{
fileExtensions.Add(extension, 1);
}
else
{
fileExtensions[extension]++;
}
对于每个文件,创建一个FileInfo
对象来获取文件信息,包括文件名和扩展名。增加totalFiles
计数器,获取文件扩展名并转换为小写,以便统一处理。然后检查扩展名是否已经在fileExtensions
字典中,如果不在,则添加新的键值对;如果已经存在,则增加对应的计数值。
输出结果
Console.WriteLine($"总文件数: {totalFiles}");
Console.WriteLine("文件类型统计:");
foreach (var ext in fileExtensions)
{
Console.WriteLine($" 后缀 \"{ext.Key}\" 的文件有 {ext.Value} 个");
}
遍历完成后,输出总的文件数量和每种文件类型的统计结果。这包括打印总的文件数,以及每种文件扩展名和对应的文件数量。
异常处理
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权访问目录: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
在遍历过程中,使用try-catch
块来捕获并处理可能出现的异常,如UnauthorizedAccessException
(当没有权限访问某个目录时抛出)和其他未指定的异常。这有助于程序在遇到错误时仍能优雅地继续运行,而不是突然崩溃。
主方法
static void Main()
{
string path = @"C:\Your\Path"; // 修改为你要遍历的目录
TraverseDirectory(path);
}
在Main
方法中,调用TraverseDirectory
方法并传入要遍历的目录路径。这是程序的入口点,当程序运行时,会从这里开始执行。
源码:
using System;
using System.Collections.Generic;
using System.IO;
class DirectoryTraverser
{
public static void TraverseDirectory(string path)
{
int totalFiles = 0;
Dictionary<string, int> fileExtensions = new Dictionary<string, int>();
try
{
// 遍历目录及其子目录
foreach (var directory in Directory.EnumerateDirectories(path))
{
Console.WriteLine($"目录: {directory}");
foreach (var file in Directory.EnumerateFiles(directory))
{
FileInfo fileInfo = new FileInfo(file);
totalFiles++;
string extension = fileInfo.Extension.ToLower();
if (!fileExtensions.ContainsKey(extension))
{
fileExtensions.Add(extension, 1);
}
else
{
fileExtensions[extension]++;
}
Console.WriteLine($" 文件: {fileInfo.Name}");
}
}
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"无权访问目录: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
Console.WriteLine($"\n总文件数: {totalFiles}");
Console.WriteLine("文件类型统计:");
foreach (var ext in fileExtensions)
{
Console.WriteLine($" 后缀 \"{ext.Key}\" 的文件有 {ext.Value} 个");
}
}
static void Main()
{
string path = @"D:\BaiduNetdiskDownload\dj0527"; // 修改为你要遍历的目录
TraverseDirectory(path);
}
}
运行结果:
标签:Console,string,WriteLine,C#,Substring,str,path,z3 From: https://blog.csdn.net/m0_67996574/article/details/140157731