C#集合类

简介:



.Net的集合类

在.NetFramework中集合类有很多种,比如:Array(数组),ArrayList(数组列表),List(列表),HashTable(哈希表),Dictionary(字典),Stack(堆栈) ,Queue(队列)

ArrayList是数组的复杂版本,ArrayList 类提供在大多数Collection类中不提供但不在Array类提供的一些功能,例如:

1、Array的容量是固定的,而ArrayList的容量是根据需要自动扩展的。如果更改了ArrayList.Capacity属性的值。则自动进行内存重新分配和元素复制。

2、特定类型(不包括Object)的Array的性能比ArrayList好,这是因为ArrayList的元素属于Object类型,所以在存储或检索值类型时通常会发生装箱和拆箱

Array位于 System命名空间,而ArrayList位于 Systm.Collections 命名空间

C#集合的命名空间

C#集合的三大命名空间:

image

ArrayList

An ArrayList is a collection from a standard System.Collections namespace. It is a dynamic array. It provides random access to its elements. An ArrayList automatically expands as data is added. Unlike arrays, an ArrayList can hold data of multiple data types. Elements in the ArrayList are accessed via an integer index. Indexes are zero based. Indexing of elements and insertion and deletion at the end of the ArrayList takes constant time. Inserting or deleting an element in the middle of the dynamic array is more costly. It takes linear time.

一个ArrayList是标准System.Collctions命名空间。它是一个动态数组。它提供了随机访问元素。一个ArrayList自动扩展数据添加。与数组,数组列表可以容纳多个数据类型的数据。数组列表中的元素通过一个整数索引访问。索引是零基础。元素的索引,插入和删除的ArrayList需要持续时间。插入或删除一个元素的动态数组更昂贵。线性时间。

List

A List is a strongly typed list of objects that can be accessed by index. It can be found under System.Collections.Generic namespace.

List是一种强类型列表可以通过索引访问的对象的列表。它可以发现在System.Collections.Generic 命名空间。

 

LinkedList

链表是一个通用的双向链表在c#。LinkedList只允许顺序存取。LinkedList允许常量时间插入或者删除操作,但只有顺序存取的元素。由于引用链表需要额外的存储,它们是不切实际等数据项列表的小角色。不同于动态数组,任意数量的物品可以被添加到链表(当然内存限制)而不需要realocate,这是一项昂贵的操作。

LinkedList示例

using System;
using System.Collections.Generic;
 
public class LinkedListExample 
{
    static void Main()
    {
        LinkedList<int> nums = new LinkedList<int>();
 
        nums.AddLast(23);
        nums.AddLast(34);
        nums.AddLast(33);
        nums.AddLast(11);
        nums.AddLast(6);
        nums.AddFirst(9);
        nums.AddFirst(7);
 
        LinkedListNode<int> node = nums.Find(6);
        nums.AddBefore(node, 5);
 
        foreach(int num in nums)
        {
            Console.WriteLine(num);
        }
    }
}

运行结果

image

Dictionary

字典的检索和添加值是非常快的,但字典需要更多的内存,因为每个值也有钥匙。也被称为一个关联数组,字典是一组独特的键和值的集合,其中每字典需要更多的内存,因为每一个value都有对应的key

using System;
using System.Collections.Generic;
 
public class DictionaryExample 
{
    static void Main()
    {
        Dictionary<string, string> domains = new Dictionary<string, string>();
 
        domains.Add("de", "Germany");
        domains.Add("sk", "Slovakia");
        domains.Add("us", "United States");
        domains.Add("ru", "Russia");
        domains.Add("hu", "Hungary");
        domains.Add("pl", "Poland");
 
        Console.WriteLine(domains["sk"]);
        Console.WriteLine(domains["de"]);
 
        Console.WriteLine("Dictionary has {0} items",
            domains.Count);
 
        Console.WriteLine("Keys of the dictionary:");
 
        List<string> keys = new List<string>(domains.Keys);
 
        foreach(string key in keys)
        {
            Console.WriteLine("{0}", key);
        }        
 
        Console.WriteLine("Values of the dictionary:");
 
        List<string> vals = new List<string>(domains.Values);
 
        foreach(string val in vals)
        {
            Console.WriteLine("{0}", val);
        }
 
        Console.WriteLine("Keys and values of the dictionary:");
 
 
        foreach(KeyValuePair<string, string> kvp in domains)
        {
            Console.WriteLine("Key = {0}, Value = {1}", 
                kvp.Key, kvp.Value);
        }
    }
}

Queues

A queue is a First-In-First-Out (FIFO) data structure. The first element added to the queue will be the first one to be removed. Queues may be used to process messages as they appear or serve customers as they come. The first customer which comes should be served first.

队列是先进先出(FIFO)数据结构。第一个元素添加到队列时会将原来的第一个删除。队列可以用来处理消息时出现或按照客户来的顺序。第一个来的客户应该放在第一位。

示例代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace MyCollection
{
    class QueueExample
    {
        static void Main()
        {
            Queue<string> msgs = new Queue<string>();
 
            //入栈[将对象添加到 Queue 的结尾处]
            msgs.Enqueue("Message 1");
            msgs.Enqueue("Message 2");
            msgs.Enqueue("Message 3");
            msgs.Enqueue("Message 4");
            msgs.Enqueue("Message 5");
 
            //出栈[移除并返回位于 Queue 开始处的对象]
            Console.WriteLine(msgs.Dequeue());
            //返回位于 Queue 开始处的对象但不将其移除
            Console.WriteLine(msgs.Peek());
            Console.WriteLine(msgs.Peek());
 
            Console.WriteLine();
 
            foreach (string msg in msgs)
            {
                Console.WriteLine(msg);
            }
        }
    }
}

运行结果

image

更多知识

关于队列的更多知识请参考:http://www.cnblogs.com/tianzhiliang/archive/2010/09/21/1832664.html

Stacks

表示相同任意类型的实例的可变大小的后进先出 (LIFO) 集合。

示例代码

using System;
using System.Collections.Generic;
 
namespace MyCollection
{
    public class StackExample
    {
        static void Main()
        {
            Stack<int> stc = new Stack<int>();
 
            //调用Push方法压入堆栈
            stc.Push(1);
            stc.Push(4);
            stc.Push(3);
            stc.Push(6);
            stc.Push(4);
 
            //元素出堆
            Console.WriteLine(stc.Pop());
            //获取顶部元素对象,并不移除顶部元
            Console.WriteLine(stc.Peek());
            Console.WriteLine(stc.Peek());
 
            Console.WriteLine();
 
            foreach (int item in stc)
            {
                Console.WriteLine(item);
            }
        }
    }
}

运行结果

image

更多资料

更多请查看MSDN:http://msdn.microsoft.com/zh-cn/library/3278tedw(v=vs.110).aspx

Queue,Stack比较

关于Queue、Stack和其它集合的区别,我觉得主要区别:

Queue和Stack的用在特定的情况下,它们的一个特性是,出栈会把元素删除,并且是按照入栈的顺序出栈的

文献资料

HashTable和Dictionry的比较->参考:http://blog.csdn.net/snlei/article/details/3939206

MSDN:http://msdn.microsoft.com/zh-cn/library/ybcx56wz.aspx

C#知识网站:http://www.w3cschool.cc/csharp/csharp-tutorial.html

推荐一篇好文:http://www.cnblogs.com/jesse2013/p/CollectionsInCSharp.html


本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/3909355.html,如需转载请自行联系原作者

相关文章
|
1月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
2月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
3月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
88 2
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
3月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
56 1
|
2月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
15 0
|
3月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
29 2
|
4月前
|
C#
C#中的类和继承
C#中的类和继承
45 6
|
4月前
|
存储 C# 索引
C# 集合语法全解
C# 集合语法全解
35 0
|
4月前
|
Java C# 索引
C# 面向对象编程(一)——类
C# 面向对象编程(一)——类
38 0