C#集合:从字典到队列——探索数据结构核心

文章目录

    • C# 中的集合类型
    • C# Dictionary 字典
    • C# Hashtable:哈希表
      • Hashtable 类中的属性
      • Hashtable 类中的方法
    • C# SortedList:排序列表
      • SortedList 类的中的属性
      • SortedList 类的中的方法
    • C# Stack:堆栈
      • Stack 类中的属性
      • Stack 类中的方法
    • C# Queue:队列
      • Queue 类中的属性
      • Queue 类中的方法
    • 比较器
    • 装箱和拆箱
    • 上期习题答案

C# 中的集合类(Collection)是专门用于数据存储和检索的类,类中提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类都实现了相同的接口。
集合类的用途多种多样,例如可以动态的为元素分配内存、根据索引访问列表项等等,这些类创建 Object 类的对象集合,Object 类是 C# 中所有数据类型的基类。

C# 中的集合类型

在 System.Collections.Generic,System.Collections.Concurrent 和 System.Collections 命名空间下提供了许多集合类型,每种集合类型都有特定的用途,下面以 System.Collection 命名空间为例,该命名空间下提供的集合类型如下表所示:

描述和用法
动态数组(ArrayList)不固定长度和存储的数据类型的数组,可以存储任意类型的数据,并且长度会随着数据内容的增加减少进行改变
List类似ArrayList,只是List只能存储相同类型的数据,List的长度也不是固定的
字典(Dictionary)类似List.只能存储固定类型的数据,长度不固定
哈希表(Hashtable)哈希表可以使用键来访问集合中的元素。 哈希表中的每一项都由一个键/值对组成,键用于访问集合中的指定项。
排序列表(SortedList)存储一系列按照键进行排序的键值对,可以通过键/索引访问这些键值对
堆栈(Stack)堆栈代表了一个后进先出的对象集合。 当您需要对各项进行后进先出的访问时,则可以使用堆栈。为堆栈中添加一项称为推入项目,从堆栈中移除一项称为弹出项目。
队列(Queue)队列代表了一个先进先出的对象集合。 当您需要对各项进行先进先出的访问时,则可以使用队列。为队列中添加项目称为入队,为队列中移除项目称为出队。
点阵列(BitArray)点阵列代表了一个使用 1 和 0 来表示的二进制数组。 当您需要存储比特位,但是事先不知道具体位数时,则可以使用点阵列。可以使用整型索引从点阵列集合中访问各项,索引从零开始。

ArrayList动态数组 List泛型集合详解在本专栏上期

C# Dictionary 字典

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _01_Dictionary字典
{internal class Program{static void Main(string[] args){//类似List.只能存储固定类型的数据,长度不固定//ArrayList  List  Array使用索引进行数据的操作,字典使用"键"进行数据的操作//键: 标识 在一个字典中键是唯一的 且不能为null//格式:Dictionary<键的数据类型,值的数据类型> keyValuePairs = new Dictionary<键的数据类型,值的数据类型>();Dictionary<string,int> keyValuePairs = new Dictionary<string, int>(){{ "Name",555},{ "K",3455},//键是在运行期间校验//{ "K",345}//运行报错,已添加了具有相同键的项。};//向字典中添加数据keyValuePairs.Add("刘亦菲", 999);//通过键来获取值//获取值Console.WriteLine(keyValuePairs["Name"]);//555//通过键来修改值keyValuePairs["K"] = 234;Console.WriteLine(keyValuePairs["K"]);//表示字典中存储的个数Console.WriteLine(keyValuePairs.Count);//判断字典中是否拥有指定的键Console.WriteLine(keyValuePairs.ContainsKey("K"));//判断字典中是否拥有指定的值Console.WriteLine(keyValuePairs.ContainsValue(999));//字典一般用于一些信息的记录,用字典存储的数据,`可以加快查询的速度}}
}

C# Hashtable:哈希表

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _02_Hashtable哈希表
{internal class Program{static void Main(string[] args){//Hashtable  Hash表  表示一系列由键和值组成的数据,使用键进行访问//hash表中添加键值对,键必须是唯一的,数据类型不限制Hashtable hashtable = new Hashtable(){{0,1 },{"a",2},};hashtable.Add("洛", 1);hashtable.Add( 1,"刘某");//values 获取哈希表中所有的值Console.WriteLine(hashtable.Values);//keys 获取hash表中所有的键Console.WriteLine(hashtable.Keys);//count 获取hash表中元素的个数Console.WriteLine(hashtable.Count);//注意:因为Hash表中,所有的数据类型都是不固定的,因此在遍历key或者value 只能标注为var/object类型foreach (var key in hashtable.Keys){Console.WriteLine(key);}Console.WriteLine("--------------------------");//哈希表也可以用索引进行数据的获取和设置Console.WriteLine(hashtable[1]);hashtable[0] = 978;//判断哈希表中是否拥有指定的值Console.WriteLine(hashtable.ContainsValue("1"));//判断哈希表中是否拥有指定的键Console.WriteLine(hashtable.ContainsKey("1"));//移除带有指定键的元素hashtable.Remove(0);//清空Hash表hashtable.Clear();}}
}

Hashtable 类中的属性

下表中列出了 Hashtable 类中一些常用的属性:

属性描述
Count获取哈希表中包含的键值对的个数
IsFixedSize获取一个值,用来表示哈希表是否具有固定大小
IsReadOnly获取一个值,用来表示哈希表是否只读
Item获取或设置与指定键关联的值
Keys获取一个 ICollection,其中包含哈希表中的键
Values获取一个 ICollection,其中包含哈希表中的值

Hashtable 类中的方法

下表中列出了 Hashtable 类中一些常用的方法:

方法名描述
public virtual void Add(object key, object value)向哈希表中添加一个带有指定的键和值的元素
public virtual void Clear()从哈希表中移除所有的元素
public virtual bool ContainsKey(object key)判断哈希表是否包含指定的键
public virtual bool ContainsValue(object value)判断哈希表是否包含指定的值
public virtual void Remove(object key)从哈希表中移除带有指定的键的元素

C# SortedList:排序列表

SortedList 类的中的属性

下表列出了 SortedList 类中一些常用的属性:

属性描述
Capacity获取或设置排序列表中可包含的元素个数
Count获取排序列表中的元素个数
IsFixedSize判断排序列表是否具有固定大小
IsReadOnly判断排序列表是否只读
Item获取或设置排序列表中指定键所关联的值
Keys获取一个包含排序列表中所有键的集合
Values获取一个包含排序列表中所有值的集合

SortedList 类的中的方法

下表列出了 SortedList 类中一些常用的方法:

方法名描述
public virtual void Add(object key, object value)向排序列表中添加一个带有指定的键和值的元素
public virtual void Clear()从排序列表中移除所有的元素
public virtual bool ContainsKey(object key)判断排序列表中是否包含指定的键
public virtual bool ContainsValue(object value)判断排序列表中是否包含指定的值
public virtual object GetByIndex(int index)获取排序列表中指定索引处的值
public virtual object GetKey(int index)获取排序列表中指定索引处的键
public virtual IList GetKeyList()获取排序列表中的键
public virtual IList GetValueList()获取排序列表中的值
public virtual int IndexOfKey(object key)返回排序列表中指定键的索引,索引从零开始
public virtual int IndexOfValue(object value)返回排序列表中指定值第一次出现的索引,索引从零开始
public virtual void Remove(object key)从排序列表中移除带有指定键的元素
public virtual void RemoveAt(int index)移除排序列表中指定索引处的元素
public virtual void TrimToSize()将排序列表的容量设置为排序列表中元素的实际个数
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _03_SortedList_排序列表
{internal class Program{static void Main(string[] args){   // SortedList 排序列表//存储一系列按照键进行排序的键值对,可以通过键/索引访问这些键值对//排序列表是数组和哈希表的组合,可以使用键或索引访问各项的列表//如果使用索引访问各项,那么它就是一个动态数组(ArrayList)//如果使用键访问各项,那么它就是一个哈希表(Hashtable)//集合中的各项总是按键值进行排序SortedList  sortedList = new SortedList();sortedList.Add(10, "这是10");sortedList.Add(5, "这是5");//可以通过键进行访问Console.WriteLine(sortedList[10]);Console.WriteLine(sortedList[5]);//通过索引进行访问,排序列表会自动根据键进行排序,因为第一个的键值5Console.WriteLine(sortedList.GetByIndex(0));//这是5Console.WriteLine(sortedList.GetByIndex(1));//这是10sortedList[10] = "这是重新赋值之后的10";Console.WriteLine(sortedList.GetByIndex(1));Console.WriteLine(sortedList.Count);Console.WriteLine(sortedList.Keys);Console.WriteLine(sortedList.Values);//方法:sortedList.ContainsKey(10);sortedList.ContainsValue(5);sortedList.Remove(5);//根据键删除sortedList.RemoveAt(1);//根据索引删除sortedList.GetKey(1);//根据索引获取指定位置的键sortedList.GetByIndex(1);//根据索引获取指定位置的值}}
}

C# Stack:堆栈

在 C# 中,堆栈(Stack)类表示一个后进先出的对象集合,当需要对项目进行后进先出的访问时,则可以使用堆栈。向堆栈中添加元素称为推入元素,从堆栈中移除元素称为弹出元素。

Stack 类中的属性

下表列出了 Stack 类中一些常用的属性:

属性描述
Count获取堆栈中包含的元素个数
IsSynchronized判断是否同步对堆栈的访问(线程安全)
SyncRoot获取可用于同步对堆栈访问的对象

Stack 类中的方法

下表列出了 Stack 类中一些常用的方法:

方法名描述
public virtual void Clear()从堆栈中移除所有的元素
public virtual bool Contains(object obj)判断某个元素是否在堆栈中
public virtual object Peek()返回在堆栈顶部的对象,但不移除它
public virtual object Pop()移除并返回在堆栈顶部的对象
public virtual void Push(object obj)向堆栈顶部添加一个对象
public virtual object[] ToArray()复制堆栈到一个新的数组中

C# Queue:队列

在 C# 中,队列(Queue 类)与堆栈类似,它代表了一个先进先出的对象集合,当您需要对项目进行先进先出访问时,则可以使用队列。向队列中添加元素称为入队(enqueue),从堆栈中移除元素称为出队(deque)。

Queue 类中的属性

下表列出了 Queue 类的一些常用的属性:

属性描述
Count获取队列中包含的元素个数
IsSynchronized判断是否同步对队列的访问(线程安全)
SyncRoot获取可用于同步对队列访问的对象

Queue 类中的方法

下表列出了 Queue 类的一些常用的方法:

方法名描述
public virtual void Clear()从队列中移除所有的元素
public virtual bool Contains(object obj)判断某个元素是否在队列中
public virtual object Dequeue()移除并返回在队列开头的对象
public virtual void Enqueue(object obj)向队列的末尾处添加一个对象
public virtual object[] ToArray()复制队列到一个新的数组中
public virtual void TrimToSize()将队列的容量设置为队列中元素的实际个数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _04_Stack堆栈和Queue队列
{internal class Program{static void Main(string[] args){//堆栈(Stack)类表示一个后进先出的对象集合,当需要对项目进行后进先出的访问时,//则可以使用堆栈。向堆栈中添加元素称为推入元素(入栈),从堆栈中移除元素称为弹出元素(出栈)。//声明一个堆栈Stack<string> stack = new Stack<string>();//添加一个数据stack.Push("吴凡");stack.Push("李迪");stack.Push("罗祥");//删除一个数据(只能删除最后一个数据)stack.Pop();//获取堆栈中最上层的数据stack.Peek();//清空堆栈stack.Clear();//将堆栈转化为数组stack.ToArray();//stack.Count;//队列(Queue 类)与堆栈类似,它代表了一个先进先出的对象集合//当需要对项目进行先进先出访问时,则可以使用队列。//队列中添加元素称为入队(enqueue),从堆栈中移除元素称为出队(dequene)。Queue<String> queue = new Queue<String>();//入队 (添加)queue.Enqueue("凡凡");queue.Enqueue("吴凡");//出队 (删除)queue.Dequeue();//获取最顶部的元素queue.Peek();queue.ToArray();queue.Clear();}}
}

比较器

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _05_比较器
{internal class Program{static void Main(string[] args){// 高阶函数(高级函数):参数也是一个函数  如Find()  Sort()   数组.Average()// 回调函数:以参数的形式,传递进函数内部的函数int[] ints = { 4,1, 2, 3 };//有些数据的排序方法,需要自定义排序,需要传递一个比较器//数组的sort方法,可以传递一个lambda表达式作为比较器Array.Sort(ints,(x,y)=>y-x); //这里的Array.Sort()就是一个高阶函数,(x,y)=>y-x是一个回调函数ArrayList arrayList = new ArrayList() { 2,1,3};//ArrayList 用Sort 必须传递一个比较器实例arrayList.Sort(new MyComparer());foreach(int x in arrayList) { Console.WriteLine(x); }People[] peoples = new People[]{new People(){Name="牛头",Age=2131 },new People(){Name="马面",Age=2133},new People(){Name="驴嘴",Age=2533},     };//把proples以每个人的年龄从小到大进行排序Array.Sort(peoples, (x, y) => x.Age - y.Age);ArrayList peoplelist = new ArrayList();peoplelist.AddRange(peoples);//把peoplelist 以每个人的年龄从大到小进行排序peoplelist.Sort(new ListComparer());foreach(People people in peoplelist) {  Console.WriteLine(people.Name); }}//定义一个自己的比较器//暂且://IComparer  接口//ListComparer 类//ListComparer实现IComparer接口class ListComparer : IComparer{public int Compare(object x, object y)//固定写法{//这里只用y.Age无法访问,因为ArrayList存储的时候//把People类数据转换为object类,所以使用时要进行强制转换return ((People)y).Age - ((People)x).Age;}}class MyComparer : IComparer{public int Compare(object x, object y){return CaseInsensitiveComparer.Default.Compare(y, x);}}//这里自定义类写到了Program类中,这是可以的,因为可以在类中定义类//但严格的规范是类应该写到命名空间内class People{public int Age;public string Name;}}}

装箱和拆箱

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _06_装箱和拆箱
{internal class Program{static void Main(string[] args){//装箱:将值类型转换为引用类型的过程//拆箱:将引用类型转换为值类型的过程int a = 1;object b = a;//装箱object c = 1;int d = (int)c;//拆箱ArrayList list = new ArrayList();//装箱list.Add('a');//拆箱char i = (char)list[0];i='\0';Console.WriteLine(i);}}
}

上期习题答案

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _01_上期习题答案
{internal class Program{static void Main(string[] args){People[] peoples ={new People {Name="吴亦凡",Age=18,Sex=People.ESex.man},new People {Name="郑爽",Age=22,Sex=People.ESex.woman},new People {Name="李云迪",Age=21,Sex=People.ESex.man},new People {Name="蔡徐坤",Age=32,Sex=People.ESex.man},new People {Name="权志龙",Age=8,Sex=People.ESex.man},new People {Name="杨幂",Age=18,Sex=People.ESex.woman}};//1.查询peoples中所有的男性//People[] ps1 = Array.FindAll(peoples, FindAllMan);// bool  FindAllMan(People p)//{//    return p.Sex == People.ESex.man;//}//Func<People, bool> fn = p => p.Sex == People.ESex.man;People[] ps2 = Array.FindAll(peoples, p => p.Sex == People.ESex.man);//2.查询peoples中第一个女性People p3 = Array.Find(peoples, FindFirstWoman);People p4 = Array.Find(peoples, p => p.Sex == People.ESex.woman);//3.判断数组中是否全部都是成年人Console.WriteLine(Array.TrueForAll(peoples, Find18));Console.WriteLine(Array.TrueForAll(peoples, p => p.Age >= 18));//4.计算所有人的年龄的平均值int allAge = 0;foreach (People p in peoples){Console.WriteLine(p.Age);allAge += p.Age;}Console.WriteLine("平均值:" + (double)allAge / peoples.Length);int[] ints = new int[] { 1, 2, 3 };//计算数组的平均值Console.WriteLine(ints.Average());//People 不能直接计算,需要专递一个转换方法,把People变成数字让他计算Console.WriteLine(peoples.Average(PeopleInt));Console.WriteLine(peoples.Average(p=>p.Age));//5.查询所有人中第一个未成年的男性People child = Array.Find(peoples, FindChild);People child2 = Array.Find(peoples, p => p.Age < 18 && p.Sex == People.ESex.man);//-----------------------------//ArrayList list = new ArrayList();//foreach (int i in new int[5])//{//    list.Add(Convert.ToDouble(Console.ReadLine()));//}//double sum = 0.0;//for (int i = 0; i < list.Count; i++)//{//    //list[i]  取出ArrayList里面的每一个值(object)//    sum +=(double)list[i];//}//Console.WriteLine("平均数是:{0}", sum / list.Count);//ArrayList list = new ArrayList();1,2,4,1,//Random rd = new Random();//for (int i = 0; i < 10; i++)//{//    int num = rd.Next(10);//    //先list里面添加之前,判断list里面是否有当前生成的随机数//    if (!list.Contains(num))//    {//        //说明没有,需要添加//        list.Add(num);//    }//    else//    {//        //说明当前生成的随机数,在list中已经存在,不能添加,而且需要让for重新执行一次//        i--;//    }//}//while (list.Count!=10)//{//}//int[] num = new int[] { 1, 3, 5, 6, 8, 100, 20, 11 };泛型  也可以使用ArrayList//List<int> Jilist = new List<int>();//List<int> Oulist = new List<int>();//for (int i = 0; i < num.Length; i++)//{//    if (num[i] % 2 == 0)//    {//        Oulist.Add(num[i]);//    }//    else//    {//        Jilist.Add(num[i]);//    }//}//Jilist.AddRange(Oulist);//for (int i = 0; i < Jilist.Count; i++)//{//    Console.Write(Jilist[i] + " ");//}//Console.WriteLine("请输入一个字符串:");//string str = Console.ReadLine();//List<char> list = new List<char>();//foreach (char ch in str)//{//    list.Add(ch);//}//char[] c = list.ToArray();//for (int i = 0; i < c.Length; i++)//{//    Console.Write(c[i] + "-");//}string[] stringArray = { "aaa", "bbb", "aaa", "ccc", "bbb", "ddd", "ccc", "aaa", "bbb", "ddd" };//List用于存储从数组里取出来的不相同的元素List<string> listString = new List<string>();foreach (string eachString in stringArray){if (!listString.Contains(eachString))listString.Add(eachString);}//最后从List里取出各个字符串进行操作foreach (string eachString in listString){Console.Write(eachString); //打印每个字符串}}static public bool FindAllMan(People p){return p.Sex == People.ESex.man;}static public bool FindFirstWoman(People p){return p.Sex == People.ESex.woman;}static public bool Find18(People p){return p.Age >= 18;}static public int PeopleInt(People p){return p.Age;}static public bool FindChild(People p){return p.Age < 18 && p.Sex == People.ESex.man;}}class People{public enum ESex{man,woman}public string Name { get; set; }public int Age { get; set; }public ESex Sex { get; set; }}
}

觉得文章还不错,可以点赞,关注,评论,主页有C#教程专栏,欢迎上车!!!

图片源自网络

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/754425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习YOLOv8+Pyqt5的工地安全帽头盔佩戴检测识别系统(源码+跑通说明文件)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;318安全帽 获取完整源码源文件7000张已标注的数据集训练好的模型配置说明文件 可有偿59yuan一对一远程操作配置环境跑通程序 效果展示&#xff08;图片检测批量检测视频检测摄像头检测&#xff09; 基于深度学习YOLOv8Pyqt…

JVM的双亲委派模型和垃圾回收机制

jvm的作用是解释执行java字节码.java的跨平台就是靠jvm实现的.下面看看一个java程序的执行流程. 1. jvm中的内存区域划分 jvm也是一个进程,进程在运行过程中,要行操作系统申请一些资源.这些内存空间就支撑了后续java程序的执行. jvm从系统申请了一大块内存,这块内存在java程序使…

影响MySql 服务性能最重要的两个参数。

不同的需求&#xff0c;不同服务器硬件配置&#xff0c;要想MySql 服务处于最优状态是需要调试一些参数的&#xff0c;可调的参数非常多&#xff0c;在看完官方的mysql的文档&#xff0c;结合以前的配置情况在这里选择影响性能最大的参数作介绍&#xff1a; 先查一下参数情况&…

吴恩达深度学习环境本地化构建wsl+docker+tensorflow+cuda

Tensorflow2 on wsl using cuda 动机环境选择安装步骤1. WSL安装2. docker安装2.1 配置Docker Desktop2.2 WSL上的docker使用2.3 Docker Destop的登陆2.4 测试一下 3. 在WSL上安装CUDA3.1 Software list needed3.2 [CUDA Support for WSL 2](https://docs.nvidia.com/cuda/wsl-…

Hive SQL必刷练习题:连续问题 间断连续(*****)

问题描述&#xff1a; 1&#xff09; 连续问题&#xff1a;找出连续三天&#xff08;或者连续几天的啥啥啥&#xff09;。 2&#xff09; 间断连续&#xff1a;统计各用户连续登录最长天数&#xff0c;间断一天也算连续&#xff0c;比如1、3、4、6也算登陆了6天 问题分析&am…

html-docx-js-typescript——将html生成docx文档

html-docx-js-typescript源码&#xff1a;GitHub - caiyexiang/html-docx-js-typescript: Convert HTML documents to docx format. html-docx-js地址&#xff1a;html-docx-js - npm *简单使用&#xff1a; 获取需要转为word文档的html节点&#xff0c;借助file-saver提供的…

判断闰年(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int year 2000;//执行循环判断&#xff1b;while (year < 2010){//执行流程&#xff1b;//判断能否整除4&#xff1…

Chrome历史版本下载地址:Google Chrome Older Versions Download (Windows, Linux Mac)

最近升级到最新版本Chrome后发现页面居然显示错乱,是在无语, 打算退回原来的版本, 又发现官方只提供最新的版本下载, 为了解决这个问题所有收集了Chrome历史版本的下载地址分享给大家. Google Chrome Windows version 32-bit VersionSizeDate104.0.5112.10279.68 MB2022-05-30…

Vue3学习日记 Day4 —— pnpm,Eslint

注&#xff1a;此课程需要有Git的基础才能学习 一、pnpm包管理工具 1、使用原因 1.1、速度快&#xff0c;远胜过yarn和npm 1.2、节省磁盘空间 2、使用方式 2.1、安装方式 npm install -g pnpm 2.2、创建项目 pnpm create vue 二、Eslint配置代码风格 1、环境同步 1、禁用Pret…

华为配置WAPI-PSK安全策略实验

配置WAPI-PSK安全策略示例 组网图形 图1 配置WAPI-PSK安全策略组网图 配置流程组网需求配置思路配置注意事项操作步骤配置文件 配置流程 WLAN不同的特性和功能需要在不同类型的模板下进行配置和维护&#xff0c;这些模板统称为WLAN模板&#xff0c;如域管理模板、射频模板、VAP…

Jenkins使用pipeline流水线部署项目

新建流水线任务 前面的项目整个部署日志都在一个控制台页面&#xff0c;出现了错误不能快速定位不方便查阅 Jenkins提供了流水线方式的任务 这里我新建一个叫“pipeline-mytest”的流水线任务 在流水线出右侧有内置的样式&#xff0c;这里我选择了helloworld的样式。 构建一…

25考研|北大软微会「爆炸」吗?

软微不是已经爆炸了吗&#xff1f; 大家去看看他的录取平均分就知道了&#xff0c;没有实力千万别碰&#xff0c;现在考软微已经不存在捡漏之说。 110408的复试线已经划到了465分&#xff0c;这个人真的不低了&#xff0c;因为有数学一和408两个比较难的专业课&#xff0c;复…

网络编程 - 套接字

1、预备知识 1.1、理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址&#xff1b; 思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上, 但是还需要有一个其他的标识来区分…

完成系统支持Github三方登录

文章目录 1、需求2、在对接系统中完成客户端注册3、创建客户端应用4、CommonOAuth2Provider SpringSecurity OAuth2.0文档&#xff1a; https://docs.spring.io/spring-security/reference/servlet/oauth2/index.html 1、需求 对接Github&#xff0c;在自己系统实现支持Githu…

【C#语言入门】22. 接口、依赖反转、单元测试

【C#语言入门】22. 接口、依赖反转、单元测试 一、接口与单元测试 接口的产生&#xff1a;自底向上&#xff08;重构&#xff09;&#xff0c;自顶向下&#xff08;设计&#xff09;C#中接口的实现&#xff08;隐式&#xff0c;显式&#xff0c;多接口&#xff09;语言对面向…

【力扣hot100】49. 字母异位词分组

题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,…

osgEarth学习笔记4-第一个OsgEarth QT程序

原文链接 使用QT Creator新建一个窗口项目。 编辑pro文件 QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets CONFIG c11 DEFINES QT_DEPRECATED_WARNINGS #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated bef…

前后端分离项目部署服务器教程--实践成功

文章目录 项目介绍流程1租界云服务2通过远程软件连接服务器3部署前后端代码停止功能文件 环境配置1.安装jdk2.安装Nginx3.安装mysql数据库 花了将近一天部署前后端的项目&#xff0c;写一个日志记录一下&#xff0c;话说孰能生巧。明天把服务器恢复初始在部署一下。 项目介绍 …

【已解决】在pycharm终端无法激活conda环境,但在cmd命令行中可以

一、问题描述 在windows下winr启动cmd命令行&#xff0c;可以成功运行conda命令并且激活环境在pycharm中打开Terminal终端&#xff0c;发现无法运行conda和pip命令&#xff0c;报错环境无法激活 无法在管道中间运行文档: D:\software\Anaconda3\condabin\conda.bat。 所在位置…

Matlab|基于改进粒子群算法的混合储能系统容量优化

目录 主要内容 部分程序 下载链接 主要内容 为了调高风光互补发电储能系统的经济性&#xff0c;减少其运行费用&#xff0c;研究风光互补发电储能系统的容量优化配置模型&#xff0c;探讨粒子群算法的改进及混合储能容量优化方法。首先通过对全生命周期费用静态模型…