C#第三次作业(字符串应用)

1、把字符串的常见方法练习

序号 方法/属性 描述
1 Format 格式化字符串
2 lsNullOrEmpty 判断字符串是否为null或空(但原文lsNullOrEmpty可能有误,通常是IsNullOrEmpty
3 IsNullOrWhiteSpace 判断字符串是否为null、空或仅包含空白字符
4 Equals 判断两个字符串是否相等(对象比较)
5 Contains 判断字符串是否包含子串,大小写敏感
6 Length 字符串长度(UTF-8编码)
7 Substring 截取字符串(获取字符串的一部分)
8 IndexOf & LastIndexOf 找到某个字符串的位置(从前往后、从后往前)
9 StartsWith & EndsWith 判断字符串是否以特定内容开始或结束
10 Remove 删除字符串中的部分字符
11 Reverse 字符串反转
12 Trim 删除字符串两边的空格
13 ToLower & ToUpper 将字符串转换为小写或大写
14 Replace 替换字符串中的特定内容
15 Concat 字符串拼接,也常用+操作符实现
16 Join 把多个子串使用指定的分隔符连接起来
17 Split 根据分隔符,把字符串进行分割成字符串数组

1.1.Format

String.Format 允许你创建一个格式化的字符串。

这个方法可以接受一个格式字符串和一系列与格式字符串中的占位符相对应的参数。

占位符由大括号 {} 包围,并可以指定索引(例如 {0}{1} 等)或者名称

基本使用

string name = "Alice"; 
int age = 30; 
string formattedString = String.Format("Name: {0}, Age: {1}", name, age); 
Console.WriteLine(formattedString); // 输出: Name: Alice, Age: 30

格式说明符

String.Format 还支持格式说明符,允许你进一步控制数值、日期等的显示方式。

int number = 1234; 
string formattedNumber = String.Format("Number: {0:N0}", number); // 使用千位分隔符,无小数 
Console.WriteLine(formattedNumber); // 输出可能依赖于区域设置,例如 "Number: 1,234" 


n 或 N:带有千位分隔符的数字,也可以指定小数点后的位数。

double pi = 3.14159265; 
string formattedPi = String.Format("PI: {0:F2}", pi); // 保留两位小数 
Console.WriteLine(formattedPi); // 输出: PI: 3.14 

"{0:F2}" 将数字格式化为带有两位小数的浮点数。


DateTime now = DateTime.Now; 
string formattedDate = String.Format("Today: {0:yyyy-MM-dd}", now); 
Console.WriteLine(formattedDate); // 输出今天的日期,格式为 yyyy-MM-dd

1.2.IsNullOrEmpty和IsNullOrWhiteSpace

1. 2.1   IsNullOrEmpty

IsNullOrEmpty 方法用于检查给定的字符串是否为 null 或空字符串("")。如果字符串是 null 或空字符串,则此方法返回 true;否则返回 false

特点

  • 只需检查字符串是否为 null 或长度为0的字符串。
  • 不考虑字符串中是否只包含空白字符(如空格、制表符等)。

示例代码


	string str1 = null; 

	string str2 = ""; 

	string str3 = " "; 

	string str4 = "Hello"; 

	


	bool result1 = string.IsNullOrEmpty(str1); // true 

	bool result2 = string.IsNullOrEmpty(str2); // true 

	bool result3 = string.IsNullOrEmpty(str3); // false 

	bool result4 = string.IsNullOrEmpty(str4); // false

1.2.2   IsNullOrWhiteSpace

IsNullOrWhiteSpace 方法用于检查给定的字符串是否为 null、空字符串(""),或者仅由空白字符组成。如果字符串满足这些条件中的任何一个,则此方法返回 true;否则返回 false

扫描二维码关注公众号,回复: 17444450 查看本文章

特点

  • 除了检查字符串是否为 null 或空字符串外,还会检查字符串是否仅包含空白字符(如空格、制表符、换行符等)。
  • 对于需要确保字符串不仅存在且包含非空白字符的情况非常有用。

	string str1 = null; 

	string str2 = ""; 

	string str3 = " "; 

	string str4 = "Hello"; 

	


	bool result1 = string.IsNullOrWhiteSpace(str1); // true 

	bool result2 = string.IsNullOrWhiteSpace(str2); // true 

	bool result3 = string.IsNullOrWhiteSpace(str3); // true 

	bool result4 = string.IsNullOrWhiteSpace(str4); // false

总结

当你需要确保字符串不仅存在而且包含至少一个非空白字符时,应使用 IsNullOrWhiteSpace

而当你只需要检查字符串是否为 null 或空字符串时,IsNullOrEmpty 就足够了。

1.3.Equals

它用于比较两个对象是否相等。Equals 方法的行为可以根据它是被重写的(在派生类中)还是使用其基类(通常是 System.Object 类)的实现而有所不同。

string str = "Hello";

//c#大小写敏感,忽略大小写
//if(str.ToLower() == "hello")

if(str.ToLower().Equals("hello"))//强制转换为小写
{
Console.WriteLine("相等");//输出结果相等
}
else
{
Console.WriteLine("不相等");
}

1.4 Contains

用于检查某个元素是否存在于集合中,如数组、列表(List<T>)、字符串、字典(的键或值,取决于你如何访问它们)、集合(HashSet<T>SortedSet<T>等)等。如果集合包含指定的元素,则返回 true;否则返回 false

字符串中的Contains

在字符串(string)中,Contains 方法用于检查字符串中是否包含指定的子字符串。如果包含,则返回 true;否则返回 false

string text = "Hello, world!"; 
bool containsWorld = text.Contains("world"); // 返回 true 
bool containsEarth = text.Contains("earth"); // 返回 false

拓:列表(List<T>)中的Contains

在列表(List<T>)中,Contains 方法用于检查列表中是否包含某个特定的元素。这通常涉及到对列表中每个元素的遍历,直到找到匹配的元素或遍历完整个列表。

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; 
bool containsThree = numbers.Contains(3); // 返回 true 
bool containsSix = numbers.Contains(6); // 返回 false

1.5 Length

它主要用于获取数组(包括一维数组和多维数组)中元素的数量。Length 是一个只读属性,其类型为 int(对于一维数组)或 long(对于多维数组,通过 LongLength 属性获取)。主要用于数组类型,包括一维数组和多维数组。

// 一维数组示例 
int[] numbers = { 1, 2, 3, 4, 5 }; 
Console.WriteLine(numbers.Length); // 输出: 5 


// 多维数组示例 
int[,] matrix = { { 1, 2 }, { 3, 4 }, { 5, 6 } }; 
Console.WriteLine(matrix.GetLength(0)); // 输出第一维的长度: 3 
Console.WriteLine(matrix.GetLength(1)); // 输出第二维的长度: 2 
// 如果要获取多维数组中所有元素的总数,可以使用 
long totalElements = matrix.LongLength; // 但注意这不是通过Length属性直接获取的 
// 或者手动计算:totalElements = matrix.GetLength(0) * matrix.GetLength(1);

Length 是数组的属性,而 Count 通常是集合(如 List<T>)的属性或方法。

对于数组,使用 Length 属比性通常使用 Count() 方法(如果通过LINQ扩展方法调用)更快,因为 Length 直接返回了数组长度的值,而 Count() 方法可能需要额外的计算或遍历。

1.6 Substring

用于从一个字符串中提取子字符串。

基本用法

Substring 方法有两种基本形式:

  1. 指定起始位置和长度
    • 语法:string.Substring(int startIndex, int length)
    • 说明:这种方法允许你指定子字符串的起始位置(startIndex,从0开始计数)和要截取的长度(length)。
    • 示例:
string originalString = "Hello, World!"; 
string subString = originalString.Substring(7, 5); // 从第7个字符开始,截取5个字符 
Console.WriteLine(subString); // 输出: World

  1. 仅指定起始位置
    • 语法:string.Substring(int startIndex)
    • 说明:如果只指定一个参数(即起始位置),则会从该位置开始截取直到字符串的末尾。
    • 示例:
string originalString = "Hello, World!"; 
string subString = originalString.Substring(7); // 从第7个字符开始,截取到字符串末尾 
Console.WriteLine(subString); // 输出: World!

高级用法

  • 结合 IndexOf 方法
  • 说明:可以先使用 IndexOf 方法找到子字符串或字符的起始位置
  • 用 Substring 方法从该位置开始截取。
  • 示例:
string originalString = "Hello, World!"; 
int startIndex = originalString.IndexOf("World"); 
string subString = originalString.Substring(startIndex); // 输出: World!

  • 结合 LastIndexOf 方法
    • 说明:与 IndexOf 类似,但 LastIndexOf 用于找到子字符串或字符最后一次出现的位置。
    • 示例:

	string originalString = "Hello World Hello"; 

	int startIndex = originalString.LastIndexOf("Hello"); 

	string subString = originalString.Substring(startIndex); // 输出: Hello

  • 获取字符串的后几位
    • 示例:
string a = "hello123"; 
int num = 3; // 后3位数 
string subString = a.Substring(a.Length - num, num); // 输出: 123

注意:获取字符串的第一个字符或最后一个字符

  • 第一个字符:a.Substring(0, 1)
  • 最后一个字符(注意边界条件):a.Substring(a.Length - 1, 1)

1.7 IndexOf

用于在字符串中查找指定字符或子字符串的第一个匹配项的索引位置。它返回一个整数值,表示匹配项在字符串中的位置(索引从0开始)。如果未找到匹配项,则返回-1。

示例:与Substring结合使用

string text = "Hello, World!"; 


// 使用 IndexOf 查找字符 'o' 的位置 
int index = text.IndexOf('o'); // 返回 4 


// 使用 IndexOf 查找子字符串 "World" 的位置 
int index2 = text.IndexOf("World"); // 返回 7 


// 使用 Substring 提取从索引 7 开始的子字符串(直到字符串末尾) 
string subString1 = text.Substring(7); // 返回 "World!" 


// 使用 Substring 提取从索引 7 开始、长度为 5 的子字符串 
string subString2 = text.Substring(7, 5); // 返回 "World"

这两个方法经常一起使用,以在字符串中查找和提取特定的信息。

1.8 StartsWith和EndsWith

它们分别用于检查字符串是否以指定的子字符串开头或结尾

string text = "Hello, World!"; 
bool startsWithHello = text.StartsWith("Hello"); // 返回 true 
bool startsWithWorld = text.StartsWith("World"); // 返回 false
string text = "Hello, World!"; 
bool endsWithHello = text.EndsWith("Hello"); // 返回 false 
bool endsWithWorld = text.EndsWith("World!"); // 返回 true

注意事项

  • StartsWith 和 EndsWith 方法在进行比较时默认是区分大小写的。

  • 这两个方法在处理空字符串时也有特定的行为。例如,任何字符串都被视为以空字符串开头和结尾,因此 text.StartsWith("") 和 text.EndsWith("") 对于任何非空的 text 字符串都会返回 true

1.9 Remove

Remove 方法是 String 类的一个成员,用于从字符串中删除指定数量的字符。


string originalString = "Hello, World!"; 


string result1 = originalString.Remove(7); 
Console.WriteLine(result1); // 输出: Hello, 

string result2 = originalString.Remove(7, 6); 
Console.WriteLine(result2); // 输出: Hello, ! 

Remove(7) 从索引7(即逗号之后)开始删除字符,直到字符串的末尾。

而 Remove(7, 6) 从索引7开始删除了6个字符。

1.10 Revserse

通常用于反转数组(Array)或集合(如 List<T>)中元素的顺序。

数组的反转

int[] numbers = { 1, 2, 3, 4, 5 }; 
Array.Reverse(numbers); 
foreach (var number in numbers) 
{ 
Console.Write(number + " "); 
} 
// 输出: 5 4 3 2 1

列表的反转

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; 
numbers.Reverse(); 
foreach (var number in numbers) 
{ 
Console.Write(number + " "); 
} 
// 输出: 5 4 3 2 1

字符串的反转(不直接使用Reverse)

字符串是不可变的,不能直接在一个字符串上使用 Reverse 方法。通过转换为字符数组,反转数组,然后再将数组转换回字符串来实现:

string str = "Hello, World!"; 
char[] charArray = str.ToCharArray(); 
Array.Reverse(charArray); 
string reversedStr = new string(charArray); 
Console.WriteLine(reversedStr); 
// 输出: !dlroW ,olleH

1.11 Trim Replace

Trim 和 Replace 是字符串(String)类的两个非常有用的方法,它们用于处理字符串的特定部分。

Trim

Trim 方法用于移除字符串开头和末尾的空白字符(空格、制表符、换行符等)。Trim 方法仅从字符串的开头和末尾移除字符,不会影响字符串中间的字符。

示例
string text = " Hello, World! "; 
string trimmedText = text.Trim(); 
Console.WriteLine("'" + trimmedText + "'"); // 输出: 'Hello, World!' 


// 移除特定字符 
string textWithChars = "!!!Hello, World!!!"; 
string trimmedWithChars = textWithChars.Trim('!', ' '); 
Console.WriteLine("'" + trimmedWithChars + "'"); // 输出: 'Hello, World'

Replace

Replace 方法用于在字符串中查找指定的字符或子字符串,并用另一个字符或子字符串替换它们。

示例
string text = "Hello, World!"; 
string replacedText = text.Replace("World", "C#"); 
Console.WriteLine(replacedText); // 输出: Hello, C#! 


// 替换所有出现的字符 
string textWithMultiple = "aaabbbccc"; 
string replacedMultiple = textWithMultiple.Replace("b", "d"); 
Console.WriteLine(replacedMultiple); // 输出: aaadddccc

1.12 Concat

用于连接字符串或对象数组中的字符串表示形式的非常有用的方法。

使用string.Concat进行字符串连接时,通常比使用+运算符或字符串的+=运算符进行多次连接更高效。

示例代码


// 连接字符串实例 
string result1 = string.Concat("Hello, ", "World!"); 
Console.WriteLine(result1); // 输出: Hello, World! 


// 连接对象数组 
object[] objs = { "a", "b", "c" }; 
string result2 = string.Concat(objs); 
Console.WriteLine(result2); // 输出: abc 


1.13 Join和Split

它们分别用于将多个字符串组合成一个单独的字符串,以及将一个字符串分割成多个子字符串

Join 方法

string[] parts = { "Apple", "Orange", "Banana", "Pear", "Peach" }; 
string result = string.Join("/", parts); 
// 结果: Apple/Orange/Banana/Pear/Peach

string.Join方法接受两个参数:第一个参数是分隔符(在这个例子中是/),第二个参数是一个字符串数组(parts),包含要连接的字符串元素。

Split 方法

同样位于System.String类中,并且是一个实例方法。

string testString = "James Hare,1001 Broadway Ave,St. Louis,MO,63101"; 
string[] results = testString.Split(new[] { ',' }); 
// 结果: 数组results包含["James Hare", "1001 Broadway Ave", "St. Louis", "MO", "63101"]

testString.Split方法接受一个字符数组作为参数,这个数组包含了用作分隔符的字符(,)。


2、实现身份证的解析;

using System;

namespace DJConsoleProject
{
    public class IDCard
    {
        // 校验码  
        private static string[] checkCodes = new string[] { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };

        // 计算加权因子  
        private static int[] weightFactors = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };

        // 省份代码  
        private static readonly string[] provinceCodes = {
        "11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41",
        "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71",
        "81", "82", "91"
    };

        public static bool IsValid(string idCard)
        {
            if (string.IsNullOrEmpty(idCard) || idCard.Length != 18)
            {
                return false;
            }

            // 验证日期  
            DateTime dateTime;
            if (!DateTime.TryParseExact(idCard.Substring(6, 8), "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out dateTime))
            {
                return false;
            }

            // 验证省份代码  
            if (!provinceCodes.Contains(idCard.Substring(0, 2)))
            {
                return false;
            }

            // 验证校验码  
            return VerifyCheckCode(idCard);
        }

        private static bool VerifyCheckCode(string idCard)
        {
            char[] charArray = idCard.ToCharArray();
            int sum = 0;
            for (int i = 0; i < 17; i++)
            {
                sum += (charArray[i] - '0') * weightFactors[i];
            }

            int index = sum % 11;
            string checkCode = checkCodes[index];

            return checkCode.ToUpper() == charArray[17].ToString().ToUpper();
        }

        public static void Parse(string idCard)
        {
            if (!IsValid(idCard))
            {
                Console.WriteLine("身份证号码无效!");
                return;
            }

            string provinceCode = idCard.Substring(0, 2);
            string birthDate = idCard.Substring(6, 8);
            string sexCode = idCard.Substring(16, 1);

            // 性别(奇数为男,偶数为女)  
            string gender = int.Parse(sexCode) % 2 == 0 ? "女" : "男";

            Console.WriteLine($"省份代码: {provinceCode}");
            Console.WriteLine($"出生日期: {birthDate}");
            Console.WriteLine($"性别: {gender}");
        }

        static void Main(string[] args)
        {
            string idCard = "11010519491231002X";
            Parse(idCard);
        }
    }
}

3、遍历磁盘,列出目录和文件、统计文件个数,统计不同类型(后缀)的文件个数。

using System;
using System.Collections.Generic;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // 设定要遍历的根目录  
        string rootPath = @"D:/VM"; // 修改为你的目标盘符或路径  

        // 字典来存储不同类型文件的计数  
        Dictionary<string, int> fileCounts = new Dictionary<string, int>();

        // 遍历目录和子目录  
        TraverseDirectory(rootPath, fileCounts);

        // 输出结果  
        foreach (var kvp in fileCounts)
        {
            Console.WriteLine($"文件类型: {kvp.Key}, 数量: {kvp.Value}");
        }

        Console.ReadKey();
    }

    static void TraverseDirectory(string path, Dictionary<string, int> fileCounts)
    {
        try
        {
            // 获取目录下的所有文件和文件夹  
            string[] directories = Directory.GetDirectories(path);
            string[] files = Directory.GetFiles(path);

            // 遍历文件  
            foreach (string file in files)
            {
                FileInfo fileInfo = new FileInfo(file);
                string extension = fileInfo.Extension.ToLowerInvariant(); // 转换为小写以忽略大小写差异  

                // 如果字典中没有该类型文件,则添加  
                if (!fileCounts.ContainsKey(extension))
                {
                    fileCounts.Add(extension, 0);
                }

                // 更新计数  
                fileCounts[extension]++;
            }

            // 递归遍历子目录  
            foreach (string dir in directories)
            {
                TraverseDirectory(dir, fileCounts);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"遍历目录 {path} 时出错: {ex.Message}");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/m0_65814219/article/details/140150743