当前位置: 首页 > news >正文

C#基础学习(二)C#数组生存手册:从入门到“血压拉满“的奇妙旅程

        作为一只C#萌新,当你试图用数组装下整个世界时,系统可能会温柔地弹出一句**"Index was outside the bounds of the array."**。别慌!这份求生指南将用段子教你玩转数组

一、数组是什么

        数组简单来说就是由相同元素组成的一个集合,数组里面不一定是数,还可能是bool,string等类型组成的集合。那么他有些什么特点呢:

  • 本质:装着相同类型元素的集装箱(比如一箱肥宅快乐水)
  • 特性:长度固定(集装箱容量不可变)、有编号(每个可乐罐都有座位号)
  • 致命诱惑:访问速度极快(毕竟不用像ArrayList那样扭扭捏捏扩容)
//数组是存储一组相同类型数据的集合
//数组分为 一维 多维 交错数组
//一般情况下 一维数组简称数组

二、C#数组三大门派

        1.一维数组:直男式集装箱

怎么申明呢,

            //变量类型[] 数组名;//只是申明 并没有初始化
            //变量类型 可以是 学过的和没学过的所有变量类型

示例1:

            int[] arr1;//变量类型[] 数组名 = new 变量类型[数组的长度];int[] arr2 = new int[5];//这种方式 相当于开了5个房间 但是默认的int值是0//变量类型[] 数组名 = new 变量类型[数组的长度]{内容1,内容2,内容3,....};int[] arr3 = new int[5] {1,2,3,4,5};//变量类型[] 数组名 = new 变量类型[]{内容1,内容2,。。。。};int[] arr4 = new int[] {2,3,4,5};//后面的内容决定数组的长度//变量类型[] 数组名 = {内容1,内容2,内容3,....};int[] arr5 = { };

示例2:

// 声明方式1:班主任点名式
int[] scores = new int[5]; // 5个空座位,默认值0// 声明方式2:暴力填鸭式
int[] scores = {90, 80, 85, 0, 0}; // 第一个座位90分,第二个80分...// 使用姿势:
scores[0] = 100; // 第一个座位改成100分
Console.WriteLine(scores[2]); // 访问第三个座位

⚠️危险行为scores[5] = 60; (试图打开不存在的第6个座位,系统将对你发动"越界异常攻击"),所以务必注意在使用数组是,请处理好下标的各种情况。

示例3:数组的实际应用

            int[] array = new int[5] { 1, 2, 3, 4, 5 };//1.数组的长度//数组变量名.LengthConsole.WriteLine(array.Length);//2.获取数组中的元素//数组中的下标和索引 他们都是从0开始的//数组的范围 0~Length - 1Console.WriteLine(array[0]);//3.修改数组中的元素array[0] = 99;//4.遍历数组 通过循环 快速获取数组中的每一个元素for (int i = 0; i < array.Length; i++){Console.WriteLine(array[i]);}//5.增加数组的元素//数组初始化以后 是不能 直接添加新的元素int[] array2 = new int[6];for (int i = 0; i < array.Length; i++){array2[i] = array[i];}array = array2;//先搬家 先把原有数据储存 等新家建好后 在搬回来 自动把房子变大了//6.删除数组的元素//数组初始化以后 是不能 直接删除新的元素//搬家的原理int[] array3 = new int[5];for (int i = 0; i < array3.Length; i++){array3[i] = array[i];}array = array3;//7.查找数组中的元素//遍历即可

         2. 多维数组:强迫症の矩形方阵​(比如Excel表格)

既然数组是排成一排的一组元素,你有没想过,将他拼成两排,三排或者更多排呢

下面先来看看简单二维数组是怎么定义的:

            //二维数组的申明int[,] arr3 = new int[,] {{ 1, 2 },{ 3, 4 },{ 5, 6 },{ 7, 8 } };//PLUSint[,] arr4 =  {{ 1, 2 },{ 3, 4 },{ 5, 6 },{ 7, 8 } };

好的,现在你已经知道怎么定义二维数组了,是时候该传授你该如何使用这个东西:

二维数组的使用方法(简单版):

//二维数组的使用
//1.二维数组的长度
int[,] array = new int[,] { {8,9,55 },{ 48,85,95} };
Console.WriteLine(array.GetLength(0));//得到多少行
Console.WriteLine(array.GetLength(1));//得到多少列//2.获取二维数组中的元素
Console.WriteLine(array[0,1]);//3.修改二维数组中的元素
array[0, 0] = 55;
Console.WriteLine(array[0,0]);
//4.遍历二维数组
for (int i = 0; i < array.GetLength(0); i++) //行
{for (int j = 0; j < array.GetLength(1); j++) //列{Console.WriteLine(array[i, j]);}}
//5.增加数组的元素
int[,] array2 = new int[3, 3];

        值得关注的主要是一个函数,两个输入值:GetLength(0),当是0的时候表示获取到的是二维数组的行数,当然咱们就一个二维数组。自然而然行数就为2哈。好像没啥用,嘿嘿。不过,我们下面即将介绍的交错数组,那个时候就可以发挥巨大作用了!里面的参数为1时获取的为列数,这个显而易见。

        示例:

// 二维数组声明:
int[,] matrix = new int[3,4]; // 3行4列的数学课座位表// 三维数组声明(慎用,容易晕车):
int[,,] cube = new int[2,3,4]; // 2层楼,每层3行4列// 使用姿势:
matrix[0,1] = 42; // 第一行第二列塞入42
Console.WriteLine(matrix.GetLength(0)); // 获取行数:3

⚠️雷区警示:所有行必须一样长!就像军训队列,不允许有人偷懒少站一列。

        3. 交错数组(锯齿数组):俄罗斯套娃の千层套路

        除了前面规规整整的数组,每一行的元素数目都是一样的以外。其实C#还给我们提供了一个不用像这样必须每行元素都要一样长,每行元素任意coder操作的数组,那就是交错数组!你可以自由决定你每一行的元素个数,就相当于你将很多个不同长度的一维数组从上往下依次放好。下面咱们来看看其怎么声明的:

//数组的申明
//变量类型[][] 交错数组名;
int[][] arr1;
//变量类型[][] 交错数组名 = new 变量类型[行数][];
int[][] arr2 = new int[3][];
//变量类型[][] 交错数组名 = new 变量类型[行数][]{一维数组1,一维数组2,一维数组3......};
int[][] arr3 = new int[3][] { new int[] { 1,2,3},new int[] { 1,2},new int[] { 1} };
int[][] arr4 = new int[][] { new int[] { 1,2,3},new int[] { 1,2},new int[] { 1} };
int[][] arr5 = { new int[] { 1,2,3},new int[] { 1,2},new int[] { 1} };

 ✨优势:每行长度可随意变化,像乐高积木一样自由(适合处理不规则数据,比如CSV文件)

// 声明方式:先造外层箱子,再给每个箱子塞内层箱子
int[][] jagged = new int[3][]; 
jagged[0] = new int[] {1,3,5}; // 第一个箱子装3个元素
jagged[1] = new int[] {2,4};   // 第二个箱子装2个元素(参差不齐才是美)
jagged[2] = new int[] {666};   // 第三个箱子只装一个卷王// 使用姿势:
Console.WriteLine(jagged[1][0]); // 输出2(第二箱子的第一个元素)

实际使用:

int[][] arr6 = { new int[] {1,2,3,5},new int[] { 4,5}};
//1.数组的长度
Console.WriteLine(arr6.GetLength(0));//行
Console.WriteLine(arr6[0].Length);//得到一行的列数
2.获取数组中的元素
Console.WriteLine(arr6[0][3]);
//Console.ReadLine();
//3.修改元素
//4.遍历元素
for (int i = 0; i < arr6.GetLength(0); i++) 
{for (int j = 0; j < arr6[i].Length; j++) {Console.Write(arr6[i][j] + "66666666 ");}}

        看到没,这里又出现了GetLength()这个函数,所以这个函数很重要啊,请快速在心里默念几遍,加深自己的记忆, GetLength(),GetLength(),GetLength,0是行啊,1是列。

        好的,我们已经介绍了C#中数组都长了些什么样子,接下来,我将传授各位一个秘密武器,那就是Array类里面提供的方便函数,接下来,和我一起来看看吧,Look in my eyes!,最后读者是MVP,笔者是躺赢狗。

  三、 Array类——数组的瑞士军刀

        在C#中,Array是所有数组的隐形爸爸(所有数组都继承自它)。它自带一套让数组"旋转跳跃"的魔法方法,但稍有不慎就会踩雷💣

        🎩 核心魔法技能(静态方法)

1、​Sort:一键整理混乱现场,将数组中元素进行排序。

 注意:会修改原数组!就像老妈帮你收拾房间,东西可能再也找不到了,是直接修改原数组

        当你的数组里面存的都是一些整数时,那排序简直就是简简单单,直接排序,那如果是字符呢,字符串呢?

int[] chaos = {5,3,9,1};
Array.Sort(chaos); // chaos变成[1,3,5,9]

        当你的数组是char[]时,Array.Sort()会化身无情的ASCII码判官,严格按照每个字符的Unicode值排序: 

char[] letters = { 'd', 'A', '3', '!', '中' };
Array.Sort(letters);
Console.WriteLine(string.Join(" ", letters)); 
// 输出:! 3 A d 中

排序规则详解: 

        1、特殊符号 < 数字 < 大写字母 < 小写字母 < 汉字
(因为!的Unicode是33,3是51,A是65,d是100,是20013)

        2、大小写敏感:大写字母永远排在小写前面

char[] caseTest = { 'a', 'Z', 'B' };
Array.Sort(caseTest);
// 结果:B Z a (B(66) < Z(90) < a(97))

        字符串数组(string[])排序:文化差异的修罗场排序规则解密:字符串排序是字典序比较,但有个隐藏雷区——文化敏感性(Culture)​。默认情况下:

string[] words = { "apple", "Banana", "cherry", "1", "_" };
Array.Sort(words);
// 结果:_ 1 apple Banana cherry

 排序规则详解

        1、优先级阶梯
符号/数字 → 大写字母 → 小写字母,_的ASCII是95,1是49,但字符串比较时数字被视为整体

        2、逐字符比较

string[] test = { "a", "ab", "abc", "b" };
Array.Sort(test);
// 结果:a, ab, abc, b (像字典一样逐个字母比较长度)

        3、文化差异炸弹陷阱:

        在土耳其等地区,字母i的大写是İ(带点),而I的小写是ı(无点)。若未指定文化:

这个不是很重要,用到了再来了解也是一样的。

Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
string[] turkishTest = { "ı", "i", "İ" };
Array.Sort(turkishTest);
// 默认排序可能与英语环境不同!

常见小坑:

        混合类型数组的迷惑行为

object[] mixedArray = { 5, "3", 'A' };
Array.Sort(mixedArray); // 运行时直接炸裂!
// 错误信息:至少一个对象必须实现IComparable

        自以为是的数字字符串排序 

string[] numbers = { "100", "20", "3" };
Array.Sort(numbers);
// 你以为会排成3,20,100?实际结果是"100","20","3"(按字符逐个比较)

2、Reverse:倒放人生

        核心原则:​只翻转元素顺序,绝不碰元素内容无论数组里装的是数字、字符串还是对象,它都像搬家师傅一样,只管把箱子位置调换,绝不拆箱!

Array.Reverse(chaos); // chaos变成[9,5,3,1]

如果用在二维数组,只会反转第一层容器,内层纹丝不动

        双层嵌套的俄罗斯套娃

string[][] jagged = {new[] { "A", "B" },new[] { "C", "D", "E" },new[] { "F" }
};Array.Reverse(jagged); // 只反转外层数组
/*
结果变成:
[ ["F"], ["C","D","E"], ["A","B"] ]
*/// 如果想连内层一起反转
foreach(var arr in jagged){Array.Reverse(arr);
}
/*
最终结果:
[ ["F"], ["E","D","C"], ["B","A"] ]
*/
  • Reverse() 默认只操作最外层,像剥洋葱一样需要手动层层深入
  • 深度反转需要递归操作(小心栈溢出!)

 一些常见坑:

        以为字符串内容会被反转:

string[] words = { "hello", "world" };
Array.Reverse(words);
// 数组变成 ["world", "hello"],但每个字符串还是原样
// 想反转字符串本身需要额外操作:
words[0] = new string(words[0].Reverse().ToArray()); // "hello" → "olleh"
  • 它很单纯:只负责调换元素位置,不管元素是啥
  • 它很专一:对多维数组永远只动最高维度
  • 它很快:时间复杂度是 O(n/2),比你自己写循环高效
  • 它很危险:遇到 null 或越界区域会瞬间翻脸

3、Copy:克隆人战争

int[] target = new int[4];
Array.Copy(chaos, target, 2); // 复制前两个元素到目标数组
// target变成[9,5,0,0]

🔍 细节:第三个参数是复制数量,不是索引!

4、IndexOf:寻人启事

int pos = Array.IndexOf(chaos, 5); // 返回1(下标位置)
int notFound = Array.IndexOf(chaos, 666); // 返回-1

💡 技巧:找不到时返回-1,记得判断!否则可能引发连锁反应

5、Resize:整容手术(其实是换头术)

Array.Resize(ref chaos, 6); 
// chaos变成[9,5,3,1,0,0](原数组已被替换!)

 惊天大坑:你以为是在原数组上扩容?实际是创建新数组,杀死旧数组!

        当你在代码中写下 Array.Resize(ref arr, newSize),你以为数组像孙悟空的金箍棒一样自由伸缩?

int[] original = { 1, 3, 5 };
Array.Resize(ref original, 5);
// 发生了什么?
// 1. 偷偷new一个新数组:[0,0,0,0,0]
// 2. 把旧数组元素复制过去:[1,3,5,0,0]
// 3. 把original变量指向新数组
// 4. 旧数组被丢进垃圾回收站

        灵魂拷问:原数组真的被"扩容"了吗?不!它已经死了,现在你看到的只是戴着原数组面具的新数组!阿伟已经死了! 

        Resize()的注意事项:

        1、ref参数,不加相当于你没有将修改的东西传出来,至于这个ref是啥,好像听说他还有个兄弟叫out,我们后面再说。

int[] arr = { 1, 2 };
Array.Resize(ref arr, 3); // 必须加ref!否则白忙活
// 忘记ref的惨案:
Array.Resize(arr, 3); // 原数组纹丝不动!

        2、值类型和引用类型区别

// 值类型数组:新空间填默认值
int[] nums = { 1 };
Array.Resize(ref nums, 3);
// 变成 [1, 0, 0]// 引用类型数组:新空间都是null
Student[] students = { new Student() };
Array.Resize(ref students, 3);
// 变成 [student实例, null, null]

        3、缩容时的断舍离,当断则断就像杨过断手臂一样。 

string[] words = { "A", "B", "C", "D" };
Array.Resize(ref words, 2);
// 直接腰斩!变成 ["A", "B"]
// 被抛弃的"C","D":终究是错付了😭
场景推荐方案优势
频繁增删List自动扩容、性能优化
超大数组MemoryPool内存池管理、减少GC压力
需要保留旧引用手动创建新数组复制完全掌控内存生命周期

        记住:Array.Resize() 就像给数组做换头手术,手术成功后,你的数组将拥有新长度、新身体,但——不再是最初的那个TA

        🧙 实例方法(通过数组对象调用)

​1、GetLength:多维数组の测谎仪

int[,] matrix = new int[3,4];
Console.WriteLine(matrix.GetLength(0)); // 3(第一维长度)
Console.WriteLine(matrix.GetLength(1)); // 4(第二维长度)

 错误示范:用在交错数组会报错!交错数组请用array.Length

2、Clone:深度复制?天真!

int[] source = {1,2,3};
int[] clone = (int[])source.Clone(); 
clone[0] = 666; // source不受影响(值类型安全)// 但如果是对象数组...
Student[] students = { new Student() };
Student[] evilClone = (Student[])students.Clone();
evilClone[0].Name = "张三"; // 原数组里的对象也被修改了!

        深水炸弹:Clone()是浅拷贝!引用类型数组会共享对象

        好的  方法已经传授给你了,该你好好使用了,接下来我将为你展示一些常见的错误,希望你不要再犯了哦

      坑1:  交错数组必须先初始化每一行(这个在上面也说明了,在这里强调是为了加深印象!!!)

int[][] jagged = new int[3][]; // 只创建了外层箱子
jagged[0][1] = 5; // 运行时NullReferenceException!内层箱子还没造// 正确姿势:逐行初始化
jagged[0] = new int[2]; // 造第一个箱子
jagged[1] = new int[3]; // 造第二个箱子(尺寸不同)
jagged[0][1] = 5; // 安全操作

        坑2:多维数组 vs 交错数组的GetLength

int[,] matrix = new int[3,4];
Console.WriteLine(matrix.GetLength(0)); // 正确:3int[][] jagged = new int[3][];
Console.WriteLine(jagged.GetLength(0)); // 正确:3
Console.WriteLine(jagged[0].GetLength(0)); // 错误!如果jagged[0]未初始化

        坑3:Clear方法的温柔陷阱

int[] nums = {1,2,3,4,5};
Array.Clear(nums, 0, nums.Length);
// 值类型数组:全变成0
// 引用类型数组:全变成null(可能引发后续空指针异常)

        坑4:自定义对象的Sort需实现IComparable

class Cat{public int Age;
}Cat[] cats = new Cat[3];
Array.Sort(cats); // 运行时炸裂!因为Cat类没有定义比较规则

总结: 

  1. ​交错数组初始化口诀:
    ​先造外箱,再造内箱,逐行填装,小心空箱

  2. ​Array方法使用三连问:

    • 是否会修改原数组?(如Sort、Reverse会)
    • 是否处理引用类型?(Clone浅拷贝需警惕)
    • 返回值是否需要接收?(如Resize要配合ref)
  3. ​多维数组 vs 交错数组选择指南:

    • 需要数学计算 → 多维数组(内存连续效率高)
    • 需要灵活行长度 → 交错数组(但初始化更繁琐)

        好的 现在你已经掌握了极大多数的数组的知识,好好去代码世界闯荡一番吧!芜湖起飞!

补充知识点:自定义比较器:

        为什么要自定义比较器?

  • 想把 ["Apple", "Banana", "cherry"] 按字母无视大小写排序
  • 想让人物对象数组按年龄倒序+身高升序排列
  • 需要把 ["100", "20", "3"] 识别为数字排序(而非字典序)

        这时候就该祭出IComparer接口,让数组按你的节奏摇摆

场景1:字符串长度优先排序(短的在前)
class 长度比较器 : IComparer<string>
{public int Compare(string x, string y){// 处理null值(null视为无限小)if (x == null) return -1;if (y == null) return 1;int lenCompare = x.Length.CompareTo(y.Length);return lenCompare != 0 ? lenCompare : string.Compare(x, y);}
}// 使用示例:
string[] words = { "C#", "is", "awesome", null, "!" };
Array.Sort(words, new 长度比较器());
// 结果:null, "!", "C#", "is", "awesome"

最后两句代码的解释: 

// 第一战:比较字符串长度
// CompareTo()返回值:
// - 负数表示x.Length < y.Length(x应该排在前面)
// - 0表示长度相同
// - 正数表示x.Length > y.Length(x应该排后面)
int lenCompare = x.Length.CompareTo(y.Length);// 第二战:如果长度不同,直接返回长度比较结果
// 如果长度相同,进入字典序加时赛(调用默认字符串比较)
return (lenCompare != 0) ? lenCompare          // 长度不同,按长度排序: string.Compare(x, y); // 长度相同,按字母表顺序排

 

场景2:对象数组多条件排序

假设有Student类:

class Student
{public string Name { get; set; }public int Age { get; set; }public double Score { get; set; }
}// 先按年龄降序,年龄相同按分数升序
class 学霸比较器 : IComparer<Student>
{public int Compare(Student x, Student y){// 处理null(假设null学生排最后)if (x == null) return 1;if (y == null) return -1;int ageCompare = y.Age.CompareTo(x.Age); // 降序if (ageCompare != 0) return ageCompare;return x.Score.CompareTo(y.Score); // 升序}
}// 使用:
Student[] students = { /* 学生数据 */ };
Array.Sort(students, new 学霸比较器());

解释语句 

// 第一步:比较年龄(降序规则)
// 注意这里故意用 y.Age.CompareTo(x.Age) 而不是 x.Age.CompareTo(y.Age)
// 假设:
//   x.Age = 18,y.Age = 20 → y.CompareTo(x) = 20.CompareTo(18) = 1(正数)
// 返回正数表示x应该排在y后面 → 年龄大的排前面
int ageCompare = y.Age.CompareTo(x.Age); // 如果年龄不同,直接返回比较结果(年龄大的胜出)
if (ageCompare != 0) return ageCompare;// 第二步:年龄相同时,比较分数(升序规则)
// 此时用x.Score.CompareTo(y.Score)正常比较
// 假设:
//   x.Score = 85,y.Score = 90 → 85.CompareTo(90) = -1(负数)
// 返回负数表示x应该排在y前面 → 分数低的排前面
return x.Score.CompareTo(y.Score); 

相关文章:

C#基础学习(二)C#数组生存手册:从入门到“血压拉满“的奇妙旅程

作为一只C#萌新&#xff0c;当你试图用数组装下整个世界时&#xff0c;系统可能会温柔地弹出一句**"Index was outside the bounds of the array."**。别慌&#xff01;这份求生指南将用段子教你玩转数组 一、数组是什么 数组简单来说就是由相同元素组成的一个集合&a…...

MySQL 性能优化方向

MySQL 性能优化是一个系统性的工作,涉及数据库设计、查询优化、索引优化、硬件配置等多个方面。以下是 MySQL 性能优化的主要方向和具体优化方案: 一、数据库设计优化 1. 合理设计表结构 规范化设计:避免数据冗余,确保数据一致性。适度反规范化:在查询频繁的场景下,适当…...

2025年- G26-Lc100-57.插入间隔(max、min)--java版

1.题目描述 题目翻译&#xff1a; 给定一个不重叠的区间阵列 intervals&#xff0c;其中intervals[i] [starti, endi]表示第i一个区间的起始位置和结束位置&#xff0c;并且intervals 按照起始位置starti升序排序。 另外&#xff0c;给定一个新的区间newInterval [start, e…...

Burp Suite HTTPS解密原理

HTTPS HTTPS是在HTTP的基础上增加了SSL/TLS协议&#xff0c;提供了数据的加密、完整性校验和身份认证等安全保障。HTTPS的工作过程可以分为两个阶段&#xff1a;握手阶段和数据传输阶段。 流程如下图所示&#xff1a; 通过上面的图可以看到&#xff0c;在TCP建立连接后会发起…...

【ESP32S3】esp32获取串口数据并通过http上传到前端

通过前面的学习&#xff08;前面没发过&#xff0c;因为其实就是跑它的demo&#xff09;了解到串口配置以及开启线程实现功能的工作流程&#xff0c;与此同时还有esp32作为STA节点&#xff0c;将数据通过http发送到服务器。 将这两者联合 其实是可以得到一个&#xff1a;esp32获…...

怎么查看linux是Ubuntu还是centos

要确定你的Linux系统是基于Ubuntu还是CentOS&#xff0c;可以通过几种不同的方法来进行判断。下面是一些常用的方法&#xff1a; 要快速判断 Linux 系统是 Ubuntu 还是 CentOS&#xff0c;可通过以下方法综合验证&#xff1a; 一、查看系统信息文件 1. /etc/os-release 文件…...

Qt进程间通信:QSharedMemory 使用详解

1. 什么是 QSharedMemory&#xff1f; QSharedMemory 是 Qt 中用于进程间共享内存的类。它允许多个进程共享一块内存区域&#xff0c;从而避免数据传输时的 IO 操作&#xff0c;提高通信速度。通过共享内存&#xff0c;多个进程可以直接读写这块内存&#xff0c;而无需经过文件…...

【day1】数据结构刷题 链表

一 反转链表 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]…...

使用redis设置店铺状态

知识点&#xff1a; 将前端传过来的status&#xff08;0&#xff0c;1&#xff09;通过redis对象以key&#xff0c;values值的形式存放在redis中。 #设置店铺状态 redisTemplate.opsForValue().set(KEY,status); #获取店铺状态 Integer status (Integer) redisTemplate.o…...

基于python+django的商城网站-电子商城管理系统源码+运行

基于 python 开发的电子商城网站&#xff0c;平台采用 B/S 结构&#xff0c;后端采用主流的 Python 语言进行开发&#xff0c;前端采用主流的 Vue.js 进行开发。该系统是给师弟做的课程作业。同学们可以拿去自用。学习问题可以留言哦。 整个平台包括前台和后台两个部分。 前台…...

深度解读 C 语言运算符:编程运算的核心工具

一、引言 在 C 语言的编程世界中&#xff0c;运算符是构建逻辑与运算的基石&#xff0c;它如同一位指挥家&#xff0c;精准地协调着程序中各种数据的操作与处理。C 语言丰富多样的运算符涵盖了算术、关系、逻辑、位运算、赋值以及其他杂项运算等多个领域&#xff0c;为开发者提…...

docker中间件部署

1.docker安装 # 1.卸载旧版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2.需要的安装包 yum install -y yum-utils# 3.设置镜像的仓库 # 3.1.默认是国外的&#x…...

【Python Cookbook】字符串和文本(二)

字符串和文本&#xff08;二&#xff09; 6.字符串忽略大小写的搜索替换7.最短匹配模式8.多行匹配模式9.将 Unicode 文本标准化10.在正则式中使用 Unicode 6.字符串忽略大小写的搜索替换 你需要以忽略大小写的方式搜索与替换文本字符串。 为了在文本操作时忽略大小写&#xf…...

docker pull时报错:https://registry-1.docker.io/v2/

原文&#xff1a;https://www.cnblogs.com/sdgtxuyong/p/18647915 https://www.cnblogs.com/OneSeting/p/18532166 docker 换源&#xff0c;解决连接不上的问题。 编辑以下文件&#xff0c;不存在则创建&#xff1a; vim /etc/docker/daemon.json {"registry-mirrors&qu…...

DeepSeek助力文案,智能音箱如何改变你的生活?

你好&#xff0c;我是三桥君 你有没有为写智能音箱的宣传文案而抓耳挠腮过&#xff1f;三桥君在这方面可是有些感想&#xff0c;今天就来给你唠唠怎么用DeepSeek写出超赞的智能音箱宣传文案。 首先&#xff0c;你得给DeepSeek喂足“料”。这就好比做饭&#xff0c;你得准备好各…...

【机器学习】什么是随机森林?

什么是随机森林&#xff1f; 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;它通过组合多个决策树来提高预测的准确性和鲁棒性。可以把随机森林看作是“森林”&#xff0c;而森林中的每棵树就是一个决策树。每棵树独立地做出预测&#xff0c;最…...

Nature Machine Intelligence 嵌入式大语言模型使机器人能够在不可预测的环境中完成复杂的任务

近期英国爱丁堡大学发表Nature Machine Intelligence研究工作&#xff0c;提出了一种名为ELLMER&#xff08;具身大型语言模型支持机器人&#xff09;的创新框架&#xff0c;通过整合大型语言模型&#xff08;如GPT-4&#xff09;、检索增强生成&#xff08;RAG&#xff09;、视…...

[特殊字符] 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字

&#x1f50d; 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字 &#x1f680; 题目速览 题目难度&#xff1a;⭐⭐⭐&#xff08;需掌握位运算与组合数学&#xff09; 考察重点&#xff1a;二进制状态处理、位运算、乘法原理、枚举 P10984 [蓝桥杯 2…...

【AcWing】算法基础课-数学知识

目录 1、质数 1.1 试除法判定质数 暴力解法 优化解法 1.2 分解质因数(试除法) 暴力解法 优化解法 1.3 筛质数 朴素筛法(nlogn) 埃氏筛法(nloglogn) 线性筛法(n) 2、约数 2.1 试除法求约数 2.2 约数个数 2.3 约数之和 2.4 最大公约数 实现方法一 实现方法二 …...

JVM常见概念之条件移动

问题 当我们有分支频率数据时&#xff0c;有什么有趣的技巧可以做吗&#xff1f;什么是条件移动&#xff1f; 基础知识 如果您需要在来自一个分支的两个结果之间进行选择&#xff0c;那么您可以在 ISA 级别做两件不同的事情。 首先&#xff0c;你可以创建一个分支&#xff…...

k8s存储介绍(二)Secret

Kubernetes&#xff08;K8s&#xff09;提供了一种安全的方式来存储和管理敏感信息&#xff0c;如密码、OAuth 令牌和 SSH 密钥&#xff0c;这就是 Secret。使用 Secret 可以避免将敏感数据硬编码到 Pod 规范或容器镜像中&#xff0c;从而提高安全性和可管理性。 1. Secret 的…...

Css布局-常规流笔记

https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Normal_Floworghttps://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Normal_Flow 前言 常规流布局是html元素默认布局&#xff0c;凡是没有设置过css布局的html元素&#xff0c;默认布局方式称为常…...

Linux系统管理与编程08:任务驱动综合应用

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 [环境] windows11、centos7.9.2207、zabbix6、MobaXterm、Internet环境 [要求] zabbix6.0安装环境&#xff1a;Lamp&#xff08;linux httpd mysql8.0 php&#xff09; [步骤] 3 …...

基于 OCO - 2 氧气 A 带辐射数据与地面台站气压观测数据构建近地面气压监测算法方案

基于 OCO - 2 氧气 A 带辐射数据与地面台站气压观测数据构建近地面气压监测算法方案 一、数据获取与准备 (一)OCO - 2 氧气 A 带辐射数据 数据下载:从 OCO - 2 官方数据发布平台(如 NASA 的相关数据存储库),按照研究所需的时间范围(例如,近 5 年的数据以获取足够的样本…...

Linux centos7 虚拟用户访问脚本

下面是脚本&#xff1a; #!/bin/bash #function:创建 vsftpd 虚拟用户脚本 #author: 20250324 IT小旋风# 判断是否是 root 用户 if [ "$USER" ! "root" ]; thenecho "不是 root 用户&#xff0c;无法进行安装操作"exit 1 fi# 关闭防火墙 system…...

HTTP 协议中请求与响应的详细解析

前言&#xff1a;HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是用于在互联网上传输超文本的协议 --由一个请求和响应组成&#xff0c;一个完整的 HTTP 请求由请求行&#xff08;Request Line&#xff09;、请求头&#xff08;Headers&…...

Collectors.toMap / list 转 map

前言 略 Collectors.toMap List<User> userList ...; Map<Long, User> userMap userList.stream().collect(Collectors.toMap(User::getUserId, Function.identity()));假如id存在重复值&#xff0c;则会报错Duplicate key xxx, 解决方案 两个重复id中&#…...

根据模板将 Excel 明细数据生成 PDF 文档 | PDF实现邮件合并功能

在日常办公中&#xff0c;我们常常会面临这样的需求&#xff1a;依据特定的模板&#xff0c;把 Excel 里的每一条数据转化为单独的 PDF 文档&#xff0c;且这些 PDF 文档中的部分内容会根据 Excel 数据动态变化。这一功能不仅能高效完成任务&#xff0c;还支持图片的动态替换&a…...

<KeepAlive>和<keep-alive>有什么区别

在不同的前端技术框架里&#xff0c;<KeepAlive> 和 <keep-alive> 有着不同的含义与使用场景&#xff0c;下面分别从 Vue 2 和 Vue 3 来为你详细介绍它们的区别。 Vue 2 中的 <keep-alive> 在 Vue 2 里&#xff0c;<keep-alive> 属于内置组件&#x…...

vscode正则表达式使用

小标题 ^\d.\d.\d\s.*$ ^表示匹配字符串的开头。\d\.\d\.\d表示匹配一到多个数字&#xff0c;接着一个小数点&#xff0c;再接着一到多个数字&#xff0c;然后又一个小数点和一到多个数字&#xff0c;用来匹配类似 “2.1.1” 这样的标题号部分。\s表示匹配一个空格。.*表示匹配…...

【LeetCode 题解】算法:4.寻找两个正序数组的中位数

1. 引言&#xff1a;挑战 LeetCode 经典算法题 在算法这片广袤无垠的天地里&#xff0c;一道道经典题目宛如夜空中熠熠生辉的星辰&#xff0c;持续吸引着开发者们投身其中&#xff0c;不断探索。今天&#xff0c;我们继续将目光聚焦于 LeetCode 平台上一道极具代表性的题目&am…...

2025.03.23【前沿工具】| CellPhoneDB:基因网络分析与可视化的利器

文章目录 1. CellPhoneDB工具简介2. CellPhoneDB的安装方法3. CellPhoneDB常用命令 1. CellPhoneDB工具简介 在单细胞生物学的迅猛发展中&#xff0c;理解细胞间的通讯机制对于揭示组织功能和疾病状态至关重要。CellPhoneDB工具&#xff0c;作为一个专门设计用来分析单细胞转录…...

Excel(进阶篇):powerquery详解、PowerQuery的各种用法,逆透视表格、双行表头如何制作透视表、不规则数据如何制作数据透视表

目录 PowerQuery工具基础修改现有数据理规则PowerQuery抓取数据的两种方式多文件合并透视不同表结构多表追加数据透视追加与合并整理横向表格:逆透视 数据用拆分工具整理数据算账龄 不等步长值组合合并文件夹中所有文件PowerQuery处理CSV文件双行表头、带合并单元格如何做数据…...

【WebGIS教程2】Web服务与地理空间服务解析

前言&#xff1a; 在万物互联的时代&#xff0c;Web服务作为跨平台协作的基石&#xff0c;正推动地理信息领域向开放共享迈进。地理空间Web服务通过标准化协议&#xff08;如WMS、WFS&#xff09;与松耦合架构&#xff0c;打破传统GIS的封闭性&#xff0c;实现数据与功能的无缝…...

[250325] Claude AI 现已支持网络搜索功能!| ReactOS 0.4.15 发布!

目录 Claude AI 现已支持网络搜索功能&#xff01;ReactOS 0.4.15 发布&#xff01; Claude AI 现已支持网络搜索功能&#xff01; 近日&#xff0c;Anthropic 公司宣布&#xff0c;其 AI 助手 Claude 现在可以进行网络搜索&#xff0c;为用户提供更及时、更相关的回复。这项新…...

gitee第三方登录获取openid | python+Django |已跑通

注&#xff1a;此项目根据美多改编&#xff0c;qq第三方需要备案gitee不用 一、获取appid和appsecret 点击右侧账号设置 左侧菜单栏数据管理里有第三方应用 点击创建应用&#xff0c;根据你的具体情况设置 二、以下是事例代码&#xff0c;根据需要修改即可 setting.py #QQ登…...

Enovia许可分析的自动化解决方案

随着企业产品生命周期管理&#xff08;PLM&#xff09;需求的不断演变&#xff0c;Enovia许可分析已成为确保资源优化和合规性的关键环节。然而&#xff0c;传统的手动许可分析方法往往效率低下、易出错&#xff0c;并且难以应对大规模数据。为了解决这一挑战&#xff0c;Enovi…...

【模拟面试】计算机考研复试集训(第十四天)

文章目录 前言一、专业面试1、进程调度中的轮转调度&#xff08;Round Robin&#xff09;如何实现&#xff1f;时间片大小对系统性能有何影响&#xff1f;2、动态规划的核心思想是什么&#xff1f;举一例说明其与分治法的区别。3、事务的ACID特性中&#xff0c;“隔离性” 如何…...

ambiq apollo3 ADC实例程序注释

#include "am_mcu_apollo.h" // Apollo MCU 外设寄存器定义和HAL库 #include "am_bsp.h" // 板级支持包&#xff08;引脚定义、LED函数等&#xff09; #include "am_util.h" // 通用工具函数&#xff08;如printf重…...

ECharts实现数据可视化

ECharts实现数据可视化 一、Echarts的简介二、Echarts使用教程1.下载echarts.min.js文件2.编写echarts代码&#xff08;1&#xff09;创建渲染实列&#xff08;2&#xff09;修改option达到预期的效果&#xff08;3&#xff09;创建配置项到实例中 三、Echarts的基础配置四、前…...

Json冲突崩溃问题

在一个项目中同时使用RapidJSON库后崩溃了。。。。 --- ### **一、潜在问题分析** 1. **符号重复定义&#xff08;ODR冲突&#xff09;** - **原因**&#xff1a;若您的库和上位机主程序均静态链接了RapidJSON&#xff08;如编译为.a或.lib&#xff09;&#xff0c;或通…...

HeyGem.ai 全离线数字人生成引擎加入 GitCode:开启本地化 AIGC 创作新时代

在人工智能技术飞速演进的时代&#xff0c;数据隐私与创作自由正成为全球开发者关注的焦点。硅基智能旗下开源项目 HeyGem.ai 近日正式加入 GitCode&#xff0c;以全球首个全离线数字人生成引擎的颠覆性技术&#xff0c;重新定义人工智能生成内容&#xff08;AIGC&#xff09;的…...

Go常见问题与答案笔记

这是一篇值的收藏的go常见问题与答案的笔记&#xff0c;内容包括了go的高级&#xff0c;如&#xff1a;悲观锁与乐观锁区别&#xff0c;for range赋值、waitgroup底层原理、go同步原语、defer关键字讲解。 文章目录 1.悲观锁VS乐观锁的区别2.for range中赋值的变量&#xff0c…...

Redis 服务搭建

&#x1f4a2;欢迎来到张翊尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Redis 服务搭建源代码编译安装获取源码安装依赖Ub…...

React-Router路由跳转、传参、抽象封装以及嵌套路由

React-Router 示例React-Router抽象路由模块步骤&#xff1a; 路由导航声明式导航编程式导航 路由导航传参searchParams传参params传参 嵌套路由配置默认二级路由404路由配置两种路由模式如何选择 示例 这里我创建两个页面&#xff0c;分别是主页和登录页分别使用编程式导航和…...

PhotoShop学习02

1.添加文本 这个工具栏是文字工具栏&#xff0c;快捷键是T。选择之后鼠标会变成一个竖杠外貌&#xff0c;我们可以借此在图片中写入文字。 选择后&#xff0c;上方的工具栏会变为专门调整文字工具 这个框点击旁边的小箭头可以选择我们我们电脑系统自带的字体&#xff0c;同时可…...

Isaac Sim与Isaac Lab初使用

目录 基于Omiverse下载Isaacsim安装Isaac Lab配置isaacsim环境测试克隆仓库配置python环境强化学习训练的测试 IsaacLab模板配置vscode环境ros接口安装 作为nvidia出品的仿真软件&#xff0c;很多机器人、机器狗【具身智能】都可以有很不错的效果&#xff0c;所以会使用isaac s…...

用户模块——自定义业务异常

用户信息查询接口 在开发用户系统时&#xff0c;一个最基本的需求就是获取用户的个人信息&#xff0c;比如昵称、头像、改名卡次数等。本部分将介绍如何实现一个用户信息查询接口&#xff0c;并结合项目中的用户背包表&#xff0c;查询用户是否有可用的改名卡。 1. 用户信息查…...

基于数据挖掘从经验方和医案探析岭南名医治疗妇科疾病的诊疗和用药规律

标题:基于数据挖掘从经验方和医案探析岭南名医治疗妇科疾病的诊疗和用药规律 内容:1.摘要 背景&#xff1a;岭南地区独特的地理环境、气候条件及人文风俗使该地区妇科疾病具有一定特点&#xff0c;岭南名医在长期临床实践中积累了丰富的治疗经验。目的&#xff1a;基于数据挖掘…...

从零到一开发一款 DeepSeek 聊天机器人

AI聊天机器人 目标设计方案系统架构技术选型功能模块 实现代码环境配置安装依赖 核心代码API 请求函数主循环函数 功能扩展1. 情感分析2. 多语言支持3. 上下文记忆4. 用户身份识别 总结附录 目标 开发一个智能聊天机器人&#xff0c;旨在为用户提供自然、流畅的对话体验。通过…...