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

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

System.Collections.Generic 类

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

System.Collections.Concurrent 类

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

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/csbasic/8042.html

发表评论

登录后才能评论