3.8C#引用类型之集合(Collection)

与数组不同,集合的长度(元素的个数)可以动态改变,可以向集合添加、删除元素

System.Collections.Generic 类

当集合中的所有元素都具有相同的数据类型时,泛型集合会非常有用。

说明
Dictionary<TKey,TValue>表示基于键进行组织的键/值对的集合。
List<T>表示可按索引访问的对象的列表。提供用于对列表进行搜索、排序和修改的方法。
Queue<T>表示对象的先进先出 (FIFO) 集合。
SortedList<TKey,TValue>表示基于相关联的 IComparer<T> 实现按键进行排序的键/值对的集合。
Stack<T>表示对象的后进先出 (LIFO) 集合。

System.Collections.Concurrent 类

只要多个线程同时访问集合,就应使用 System.Collections.Concurrent 命名空间中的类,而不是 System.Collections.Generic 和 System.Collections 命名空间中的相应类型。

说明
BlockingCollection<T>为实现 IProducerConsumerCollection<T> 的线程安全集合提供阻塞和限制功能。
ConcurrentBag<T>表示对象的线程安全的无序集合。
ConcurrentDictionary<TKey,TValue>表示可由多个线程同时访问的键/值对的线程安全集合。
ConcurrentQueue<T>表示线程安全的先进先出 (FIFO) 集合。
ConcurrentStack<T>表示线程安全的后进先出 (LIFO) 集合。
OrderablePartitioner<TSource>表示将可排序数据源拆分为多个分区的特定方式。
Partitioner提供针对数组、列表和可枚举项的常见分区策略。
Partitioner<TSource>表示将数据源拆分为多个分区的特定方式。

System.Collections 类

只要可能,则应使用 System.Collections.Generic 命名空间或 System.Collections.Concurrent 命名空间中的泛型集合,而不是 System.Collections 命名空间中的旧类型。

描述
ArrayList表示对象的数组,这些对象的大小会根据需要动态增加。
Hashtable表示根据键的哈希代码进行组织的键/值对的集合。
Queue表示对象的先进先出 (FIFO) 集合。
Stack表示对象的后进先出 (LIFO) 集合。

实现键/值对集合

Dictionary<TKey,TValue> 泛型集合可通过每个元素的键访问集合中的元素。 每次对字典的添加都包含一个值和与其关联的键。 通过使用键来检索值十分快捷,因为 Dictionary 类实现为哈希表。

以下示例创建 Dictionary 集合并通过使用 foreach 语句循环访问字典。

private static void IterateThruDictionary()
{
    Dictionary<string, Element> elements = BuildDictionary();

    foreach (KeyValuePair<string, Element> kvp in elements)
    {
        Element theElement = kvp.Value;

        Console.WriteLine("key: " + kvp.Key);
        Console.WriteLine("values: " + theElement.Symbol + " " +
            theElement.Name + " " + theElement.AtomicNumber);
    }
}

private static Dictionary<string, Element> BuildDictionary()
{
    var elements = new Dictionary<string, Element>();

    AddToDictionary(elements, "K", "Potassium", 19);
    AddToDictionary(elements, "Ca", "Calcium", 20);
    AddToDictionary(elements, "Sc", "Scandium", 21);
    AddToDictionary(elements, "Ti", "Titanium", 22);

    return elements;
}

private static void AddToDictionary(Dictionary<string, Element> elements,
    string symbol, string name, int atomicNumber)
{
    Element theElement = new Element();

    theElement.Symbol = symbol;
    theElement.Name = name;
    theElement.AtomicNumber = atomicNumber;

    elements.Add(key: theElement.Symbol, value: theElement);
}

public class Element
{
    public string Symbol { get; set; }
    public string Name { get; set; }
    public int AtomicNumber { get; set; }
}

若要转而使用集合初始值设定项生成 Dictionary 集合,可使用以下方法替换 BuildDictionary 和 AddToDictionary

private static Dictionary<string, Element> BuildDictionary2()
{
    return new Dictionary<string, Element>
    {
        {"K",
            new Element() { Symbol="K", Name="Potassium", AtomicNumber=19}},
        {"Ca",
            new Element() { Symbol="Ca", Name="Calcium", AtomicNumber=20}},
        {"Sc",
            new Element() { Symbol="Sc", Name="Scandium", AtomicNumber=21}},
        {"Ti",
            new Element() { Symbol="Ti", Name="Titanium", AtomicNumber=22}}
    };
}

以下示例使用 ContainsKey 方法和 Dictionary 的 Item[] 属性按键快速查找某个项。 使用 Item 属性可通过 C# 中的 elements[symbol] 来访问 elements 集合中的项。

private static void FindInDictionary(string symbol)
{
    Dictionary<string, Element> elements = BuildDictionary();

    if (elements.ContainsKey(symbol) == false)
    {
        Console.WriteLine(symbol + " not found");
    }
    else
    {
        Element theElement = elements[symbol];
        Console.WriteLine("found: " + theElement.Name);
    }
}

以下示例则使用 TryGetValue 方法按键快速查找某个项。

private static void FindInDictionary2(string symbol)
{
    Dictionary<string, Element> elements = BuildDictionary();

    Element theElement = null;
    if (elements.TryGetValue(symbol, out theElement) == false)
        Console.WriteLine(symbol + " not found");
    else
        Console.WriteLine("found: " + theElement.Name);
}

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/8042.html

(0)
上一篇 2021年3月7日 22:21
下一篇 2021年3月9日 20:06

相关推荐

  • 1.1C#语言的三种注释(Comment)

    1.单行注释 2.多行注释 3.文档注释

    C#语言教程 2021年1月1日
    01070
  • 2.9C#函数成员之构造函数(Constructor)

    构造函数的声明方式与方法一样,不过没有返回类型,且与所属类同名。 如果没有为类提供实例构造函数,则会自动提供不含参数的空实例构造函数。 构造函数分类 名称 修饰符 用途 静态构造函数 用 static 修饰 用于实现第一次加载时初始化类本身所需的操作。 实例构造函数 无 static 修饰 用于实现初始化类的实例所需的…

    C#语言教程 2021年2月9日
    0960
  • 5.2C#异步编程场景

    C#异步编程场景分为 I/O 绑定(例如从网络请求数据、访问数据库或读取和写入到文件系统)和 CPU 绑定(例如执行成本高昂的计算)。 I/O 绑定场景:从 Web 服务下载数据 对于 I/O 绑定代码,等待一个在 async 方法中返回 Task 或 Task<…

    C#语言教程 2021年5月2日
    0160

发表评论

登录后才能评论