很多朋友对于高效整理与分类:探索数字时代的集合管理之道和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
构建泛型集合时,接受类型参数,并且在与集合添加项之间进行更改或更改时,不需要在Object类型之间来回转换;非泛型集合将项目存储为Obejct,这需要进行转换。
集合的基本类型
删除项所有集合都直接或间接基于ICollection 或ICollection 接口。 IList 和IDictionary 及其通用对应项均派生自这两个接口
1. 在基于 IList或直接基于 ICollection的集合中,每个元素都只包含一个值。 这些类型包括:
ArrayArrayListListQueueConcurrentQueueStackConcurrentStackLinkedList
2. 在基于 IDictionary接口的集合中,每个元素都只包含一个键和一个值。 这些类型包括:
HashtableSortedListSortedListDictionaryConcurrentDictionaryKeyedCollection 类是唯一的,因为它是嵌入了键的值列表。因此,它的行为类似于列表和字典。
当需要高效的多线程集合访问时,请在System.Collections.Concurrent 命名空间中使用泛型集合。
Queue 和Queue 类提供先进先出列表。
Stack 和Stack 类提供后进先出列表。
各种集合类和用法
以下是System.Collection命名空间中各种常用的类
1. 动态数组(ArrayList): 单独索引的对象的有序集合
可以使用索引在指定位置添加和移动项目。动态数组会自动调整大小。允许对列表中的项目进行动态内存分配、添加、搜索和排序。
2. 哈希表(Hashtable): 使用键来访问集合中的元素
标识键值哈希表中的每个项目。每个项目都有一个键值对。该密钥用于访问集合中的项目。
3. 排序列表(SortedList): 使用键和索引来访问列表中的项
排序列表是数组和哈希表的组合。它包含可以使用键或索引访问的项目列表。集合中的项目始终按键值排序。
4. 堆栈(Stack): 后进先出的对象集合
当以后进先出的方式访问每个项目时,可以使用堆栈将项目作为集合类型表示收集数据的不同方式,例如哈希表、队列、堆栈、包、字典和列表元素添加到列表中,并从列表中删除项目作为推入元素。
5. 队列(Queue): 先进先出的对象集合
对每个项目的先进先出访问对于传出访问,您可以使用队列将项目添加到列表中(如弹出),并从列表中删除项目(如入队
6. 点阵列(BitArray): 使用值1 和 0 来表示 二进制 数组
)。如果需要存储位但不知道位数,可以使用点数组并使用整数索引。从点数组集合访问各种索引从头开始
不同特征的集合类型
根据不同的特性对不同的集合进行分类
出队:可以枚举每个集合以顺序访问每个元素。某些集合提供通过索引(元素在有序集合中的位置)对元素的访问;其他集合提供通过键对元素的访问,其中值与单个键关联元素访问:每个集合都有不同的性能配置文件,可用于添加元素、查找元素或删除元素等操作性能配置文件:大多数集合支持动态添加或删除元素。需要注意的是,Array、System.Span 和System.Memory 不支持动态增长和收缩
1. 可索引集合
。可索引集合是可以使用索引访问每个元素的集合。索引是序列中位于其之前的元素数。如果索引0 引用的元素是第一个元素,索引1 引用的元素是第二个元素。
创建并初始化一个字符串列表,删除元素并将元素添加到列表末尾,备注:System.Span属于ref struct类型,可提供一系列元素的快照,而无需复制这些元素//1。
//使用a创建一个字符串列表
//集合初始值设定项。
Listsalmons=["chinook", "coho", "pink", "sockeye"];
//遍历列表。
foreach(鲑鱼中的鲑鱼)
{
Console.Write(鲑鱼+"");
}
//Output: 奇努克银粉红红鲑
//通过指定从列表中删除一个元素
//对象。
鲑鱼.Remove("coho");
//使用index:进行迭代
for (var index=0; 索引鲑鱼.Count; 索引++)
{
Console.Write(鲑鱼[索引] + " ");
}
//Output: 奇努克粉红色红鲑
//添加被移除的元素
鲑鱼.Add("coho");
//遍历列表。
foreach(鲑鱼中的鲑鱼)
{
Console.Write(鲑鱼+"");
}
//Output: 奇努克粉红红银大麻哈鱼
//2.
/*
按索引从通用列表中删除元素
它使用按降序循环的“for”语句而不是“foreach”语句
RemoveAt方法会导致元素被删除后元素索引值减少
*/
列表编号=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
//删除奇数。
for (var 索引=数字.Count - 1; 索引=0; 索引--)
{
if (数字[索引] % 2==1)
{
//通过指定删除元素
//列表中从零开始的索引。
Numbers.RemoveAt(索引);
}
}
//遍历列表。
//将lambda 表达式放置在ForEach 方法中
//List(T) 对象的。
Numbers.ForEach( number=Console.Write(number + " "));
//输出: 0 2 4 6 8
//3.
/*‘
对于List中的元素类型,也可以定义自己的类
*/
私有静态无效IterateThroughList()
{
var theGalaxies=新列表{
new (){ Name="蝌蚪", MegaLightYears=400},
new (){ Name="风车", MegaLightYears=25},
new (){ Name="银河", MegaLightYears=0},
new (){ Name="仙女座", MegaLightYears=3}
};
foreach(银河系中的银河系)
{
Console.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears);
}
//输出:
//蝌蚪400
//风车25
//银河系0
//仙女座3
}
公开课银河
{
公共字符串名称{获取;放; }
公共int MegaLightYears { 得到;放; }
}
2. 键值对集合
字典集合,可以通过每个元素的key来访问集合中的元素。最常见的字典集合是Dictionary 类。字典中的每个添加都包含一个值和与其关联的键。
字典是一种常用的通用集合类型,用于存储键值对
基于哈希表实现,可以提供快速的key查找和检索功能
字典中的键必须是唯一的。如果尝试两次添加相同的密钥,将会导致运行时异常。
Dictionary的简单介绍和基本用法//1.声明并初始化一个字典
使用系统;
使用System.Collections.Generic;
班级计划
{
静态无效Main()
{
//声明并初始化字符串键和整数值的字典
Dictionaryages=new Dictionary();
//可以使用索引器(`[]`)来添加、修改或获取字典中的值
//将键值对添加到字典中
年龄["爱丽丝"]=28;
年龄["鲍勃"]=30;
年龄["查理"]=25;
//或者使用集合初始值设定项来初始化字典
字典颜色=new Dictionary()
{
{ "红色", "#FF0000" },
{ "绿色", "#00FF00" },
{ "蓝色", "#0000FF" }
};
//访问字典中的值
Console.WriteLine("爱丽丝的年龄是:" +ages["爱丽丝"]);
Console.WriteLine("绿色的颜色代码是: " + colors["Green"]);
//使用ContainsKey()方法检查字典中是否存在某个键
if (ages.ContainsKey("Bob"))
{
Console.WriteLine("鲍勃的年龄是:" +ages["鲍勃"]);
}
//使用foreach循环遍历字典
foreach(颜色中的变量对)
{
Console.WriteLine("Key:" +pair.Key + ", Value:" +pair.Value);
}
}
} //下面的例子稍微复杂一些
私有静态无效IterateThruDictionary()
{
字典元素=BuildDictionary();
//使用ContainsKey方法和Dictionary的Item[]属性来快速按键查找项目
//在C# 中使用`Item` 属性通过`elements[symbol]` 访问`elements` 集合中的项目
if (elements.ContainsKey(symbol)==false)
{
Console.WriteLine(符号+ "未找到");
}
别的
{
元素theElement=elements[symbol];
Console.WriteLine("found:" + theElement.Name);
}
//使用TryGetValue方法通过按键快速查找项目
if (elements.TryGetValue(symbol, out Element? theElement)==false)
Console.WriteLine(符号+ "未找到");
别的
Console.WriteLine("found:" + theElement.Name);
foreach(元素中的KeyValuePairkvp)
{
元素theElement=kvp.Value;
Console.WriteLine("key:" + kvp.Key);
Console.WriteLine("values:" + theElement.Symbol + " " +
theElement.Name + " " + theElement.AtomicNumber);
}
}
公共类元素
{
公共必需的字符串符号{ get;初始化; }
公共必需的字符串名称{ get;初始化; }
公共要求int AtomicNumber { get;初始化; }
}
私有静态DictionaryBuildDictionary()=new ()
{
{"K",
new (){ Symbol="K", Name="Potassium", AtomicNumber=19}},
{"钙",
new (){ Symbol="Ca", Name="Calcium", AtomicNumber=20}},
{"Sc",
new (){ 符号="Sc", 名称="钪", AtomicNumber=21}},
{"蒂",
new (){ Symbol="Ti", Name="Titanium", AtomicNumber=22}}
}; PS:
ContainsKey:https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.generic.dictionary-2.containskeyTryGetValue:https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.generic.dictionary- 2. trygetvalueDictionary 的Item[]: https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.generic.dictionary-2.item
3.迭代器
迭代器可以是方法或get 访问器,用于执行集合上的自定义迭代,使用yield return语句返回集合的每个元素,一次一个元素
通过使用foreach 语句调用迭代器,迭代器会在foreach 循环的每次迭代中被调用,并且当迭代器中到达yield return 语句时,将返回一个表达式,并保留代码中的当前位置。下次调用迭代器时,将从该位置重新开始执行。
image.png
4. LINQ 和集合
可以使用语言集成查询(LINQ) 访问集合,该查询提供筛选、排序和分组功能
私有静态无效ShowLINQ()
{
列表元素=BuildList();
//LINQ 查询。
var subset=来自elements 中的theElement
其中Element.AtomicNumber 22
按元素名称排序
选择元素;
foreach(子集中的元素)
{
Console.WriteLine(theElement.Name + " " + theElement.AtomicNumber);
}
//输出:
//钙20
//钾19
//钪21
}
私有静态ListBuildList()=new()
{
{ new(){ 符号="K", 名称="钾", AtomicNumber=19}},
{ new(){ Symbol="Ca", Name="Calcium", AtomicNumber=20}},
{ new(){ 符号="Sc", 名称="钪", AtomicNumber=21}},
{ new(){ Symbol="Ti", Name="Titanium", AtomicNumber=22}}
};
常用的集合功能
所有集合都提供在集合中添加、删除或查找项目的方法;此外,所有直接或间接实现ICollection 接口或ICollection 接口的集合都共享以下功能:
1. 可枚举集合
为了使集合能够迭代,net 可以将枚举器视为可移动指针,通过实现接口System.Collections.IEnumerable 或System.Collections.Generic.IEnumerable foreach,in 可以指向集合中的任何元素语句和For Each.Next 语句可以使用GetEnumerator 方法公开的枚举器,并隐藏操作枚举器的复杂性。任何实现System.Collections.Generic.IEnumerable 的集合都被视为可查询类型,并且可以使用LINQ 对其进行查询
2. 可建集合内容复制到数组
并使用CopyTo 方法将所有集合复制到数组中;但是,新数组中元素的顺序基于枚举器返回的元素的顺序,并且结果数组始终是下限为零的一维数组。
3. 容量和计数属性
集合的容量是它可以包含的元素数量;集合的计数是它实际包含的元素数。当集合达到其当前容量时,大多数集合都会知道扩展、重新分配内存并将元素从旧集合复制到新集合,以避免由于多次重新分配而导致性能不佳的最佳方法是将初始容量设置为估计值集合的大小。 BitArray 是一种特殊情况:它的容量与其长度相同,也与其计数相同。示例:对于List,如果Count小于Capacity,则添加项目是O(1)操作;如果需要增加容量来容纳新元素,那么添加项就变成了O(n) 操作,其中n 是Count
4. 下限一致
集合,下界是其第一个元素的索引。 System.Collections 命名空间中的所有索引集合的下限都为零,这意味着它们从0 开始索引。Array 数组的默认下限为零,但Array 类是使用Array.CreateInstance 创建的。实例化时可以定义额外的下限
5. 同步以多个线程进行访问(仅System.Collection类)
System.Collections 命名空间中的非泛型集合类型通过同步提供一些线程安全性;通常通过SyncRoot 和IsSynchronized 成员公开
选择集合类
1. 顺序列表访问(检索元素值后是是否丢弃元素)
先进先出(FIFO) 行为:使用Queue 类或Queue 泛型类后进先出(LIFO) 行为:使用Stack 类或Stack 泛型类多线程:并发版本ConcurrentQueue 和ConcurrentStack 不变性:ImmutableQueue 和ImmutableStack 的不可变版本
2. 特定顺序访问
先进先出(FIFO) : 队列类和Queue、ConcurrentQueue 和ImmutableQueue 通用类后进先出(LIFO) : Stack 类和Stack、ConcurrentStack 和ImmutableStack泛型类从头到尾/从头到尾: LinkedList 泛型类
3. 按索引访问
按从零开始的元素索引:ArrayList 和StringCollection 类以及List 泛型类
Immutability : ImmutableArray 和ImmutableList 的不可变通用版本(按元素键):Hashtable、SortedList、ListDictionary 和StringDictionary 类以及Dictionary 和SortedDictionary 通用类
不可变版本:ImmutableHashSet、ImmutableDictionary、ImmutableSortedSet 和ImmutableSortedDictionary,按从零开始的元素索引/元素键: NameObjectCollectionBase 和NameValueCollection 类以及KeyedCollection 和SortedList 泛型类
4. 每个元素包含(值、键)的组合
包含值:使用基于IList 接口或IList 通用接口的任何集合不可变选项:IImmutableList 通用接口包含键和值:使用基于IDictionary 接口或IDictionary 通用接口的任何集合不可变选项:IImmutableSet或IImmutableDictionary 泛型接口带有嵌入键的值:使用KeyedCollection 泛型类一个键和多个值:使用NameValueCollection 类
6. 与输入方式不同的方式排序
Hashtable 类按哈希码对其元素进行排序按键对元素进行排序:SortedList Class 和Sor
tedList和SortedDictionary泛型类ArrayList提供了一种Sort方法,此方法采用IComparer实现作为参数; 其泛型对应项(List泛型类)提供一种 Sort方法,此方法采用IComparer泛型接口的实现作为参数7. 快速搜索和信息检索
小集合ListDictionary速度比 Hashtable 快Dictionary泛型类提供比 SortedDictionary泛型类更快的查找多线程 :ConcurrentDictionaryConcurrentBag为无序数据提供快速的多线程插入8. 只接受字符串的集合
StringCollection(基于IList)和StringDictionary(基于IDictionary)位于System.Collections.Specialized命名空间通过指定其泛型类参数的String类,可以使用System.Collections.Generic命名空间中的任何泛型集合类作为强类型字符串集合如何选择一个集合类:https://learn.microsoft.com/zh-cn/dotnet/standard/collections/selecting-a-collection-class使用泛型集合的情况
使用泛型集合:可获得类型安全的自动化优点而无需从基集合类型派生和实现特定类型的成员 当集合元素为值类型时,泛型集合类型也通常优于与对应的非泛型集合类型,因为使用泛型不用对元素进行装箱1. 泛型类型对应于现有的集合类型
List泛型类对应于ArrayListDictionary和ConcurrentDictionary泛型类对应HashtableCollection泛型类对应于CollectionBase。Collection可以用作基类,但是与CollectionBase不同,它不抽象,这大大降低了其使用难度ReadOnlyCollection泛型类对应于ReadOnlyCollectionBase。ReadOnlyCollection不是抽象的并且拥有可以轻松地公开现有的List为只读集合的构造函数Queue、ConcurrentQueue、ImmutableQueue、ImmutableArray、SortedList和ImmutableSortedSet泛型类对应有着相应的相同名称的非泛型类2. 泛型类型没有对应的非泛型集合类型
LinkedList是一个通用的链接列表,该列表提供 O(1) 插入和删除操作SortedDictionary是一个有 O(logn) 插入和检索操作的已排序字典,这使它有效代替了SortedListKeyedCollection是列表和字典的结合,它提供了一种方法来存储包含自己的键的对象BlockingCollection通过限制和阻止功能实现集合类ConcurrentBag能快速插入和移除未排序元素不可变生成器
所有不可变的集合类型都提供 Builder 类,可以通过调用非泛型 CreateBuilder() 方法来创建 Builder 对象 通过 Builder 实例,可以调用 ToImmutable(),同样,通过 Immutable集合中,可以调用 ToBuilder() 从泛型不可变集合创建生成器实例,以下是各种 Builder 类型: ImmutableArray.BuilderImmutableDictionary.BuilderImmutableHashSet.BuilderImmutableList.BuilderImmutableSortedDictionary.BuilderImmutableSortedSet.Builder集合内的比较和排序
集合通常使用相等比较器和/或排序比较器1. 检查元素是否相等
Contains、 IndexOf、 LastIndexOf和 Remove 的方法将相等比较器用于集合元素 若集合时泛型,则按照以下原则比较项是否相等: 如果类型 T 实现 IEquatable泛型接口,则相等比较器是该接口的Equals 方法如果类型 T 未实现 IEquatable,则使用Object.Equals2. 确定排序顺序
BinarySearch 和 Sort 等方法将排序比较器用于集合元素,可在集合的元素间进行比较,或在元素或指定值之间进行比较 默认比较器依赖至少一个正在被比较的对象来实现IComparable接口。 在用作列表集合中的值,或用作字典集合中的键的所有类上实现IComparable是一种良好做法。 对泛型集合而言,等同性比较是根据以下内容确定的: 如果类型 T 实现System.IComparable泛型接口,则默认比较器是该接口的IComparable.CompareTo(T)方法 如果类型 T 实现非泛型System.IComparable接口,则默认比较器是该接口的IComparable.CompareTo(Object)方法。 如果类型 T 未实现任何接口,则没有默认比较器,必须显式提供一个比较器或比较委托 为了提供显式比较,某些方法接受IComparer实现作为参数。 例如,List.Sort方法接受System.Collections.Generic.IComparer实现 ps: System.Collections 命名空间:https://learn.microsoft.com/zh-cn/dotnet/api/system.collections?view=net-8.0文章到此结束,如果本次分享的高效整理与分类:探索数字时代的集合管理之道和的问题解决了您的问题,那么我们由衷的感到高兴!
【高效整理与分类:探索数字时代的集合管理之道】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
“Collection集合”这个词听起来很有意思啊!
有14位网友表示赞同!
感觉应该是一个有关整理、收集什么的主题吧?
有20位网友表示赞同!
COLLECTION ,是不是一个很时尚的概念呢?
有16位网友表示赞同!
喜欢收藏东西的人都会感觉这篇文章很有共鸣吧?
有5位网友表示赞同!
这个主题听起来还挺吸引人的,期待看看具体内容!
有16位网友表示赞同!
集合可以是物品也可以是想法啊,这篇文献到底写些什么呢?
有15位网友表示赞同!
有没有什么特别的收藏品让人印象深刻的?
有8位网友表示赞同!
Collection是不是在某个特定的领域里比较常见?
有9位网友表示赞同!
我很喜欢收集邮票或者图钉啊!
有6位网友表示赞同!
这个标题感觉有点专业的样子,是我不太了解的东西吗?
有14位网友表示赞同!
不知道会不会介绍一些收藏技巧或故事呢?
有12位网友表示赞同!
我觉得可以写一个关于不同人收藏意趣的文章还挺有意思的。
有14位网友表示赞同!
Collection应该有丰富的文化内涵吧?
有8位网友表示赞同!
我想知道这个文章中提到的“集合”具体是什么类型的?
有9位网友表示赞同!
这种题材的文章我好像没真正读过,好期待啊!
有8位网友表示赞同!
是不是可以分享一些关于收藏的个人经验呢?
有15位网友表示赞同!
Collection 是一个涵盖面很广的概念吧?
有20位网友表示赞同!
这篇文献会不会介绍一些收藏珍品的知识?
有12位网友表示赞同!
collection 是什么意思,我之前没听过这个词。
有7位网友表示赞同!
希望这个文章能让我开阔眼界!
有14位网友表示赞同!