18 C# 第十六章 集合的使用

来源:互联网 发布:必赢客pk10软件下载 编辑:程序博客网 时间:2024/05/21 10:04
这里主要整理了一些集合使用的例子,便于在工作时查找和使用。
这些段代码主要来自 MSDN。


List<T>

与数组有相似的属性,但随着元素的增加,其容量也会自动的扩展。当然也可以通过 TrimToSize或 Capacity来缩小其空间。

MSDN <http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx>



代码实例:  List_Sample

using System;using System.Collections.Generic;public class Example{    public static bool MyFilter(string value)    {        return value.Contains("Fi");    }    public static void Main()    {        List<string> dinosaurs = new List<string>();        Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);        dinosaurs.Add("Tyrannosaurus");        dinosaurs.Add("Amargasaurus");        dinosaurs.Add("Mamenchisaurus");        dinosaurs.Add("Deinonychus");        dinosaurs.Add("Compsognathus");        Console.WriteLine();        foreach (string dinosaur in dinosaurs)        {            Console.WriteLine(dinosaur);        }        Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);        Console.WriteLine("Count: {0}", dinosaurs.Count);        Console.WriteLine("\nContains(\"Deinonychus\"): {0}",            dinosaurs.Contains("Deinonychus"));        Console.WriteLine("\nInsert(2, \"Compsognathus\")");        dinosaurs.Insert(2, "Compsognathus");        Console.WriteLine();        foreach (string dinosaur in dinosaurs)        {            Console.WriteLine(dinosaur);        }        Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);        Console.WriteLine("\nRemove(\"Compsognathus\")");        dinosaurs.Remove("Compsognathus");        Console.WriteLine();        foreach (string dinosaur in dinosaurs)        {            Console.WriteLine(dinosaur);        }        Console.WriteLine();        Console.WriteLine("========  Sort the list  =======");        dinosaurs.Sort();        foreach (string dinosaur in dinosaurs)        {            Console.WriteLine(dinosaur);        }        Console.WriteLine();        Console.WriteLine("========  BinarySearch 方法  =======");        int nSearch = dinosaurs.BinarySearch("Five");        if (nSearch < 0)        {            dinosaurs.Insert(~nSearch, "Five");        }        foreach (string dinosaur in dinosaurs)        {            Console.WriteLine(dinosaur);        }        Console.WriteLine();        Console.WriteLine();        Console.WriteLine("========  FindAll 方法 Print the subList  =======");        List<string> subList = dinosaurs.FindAll(MyFilter);        foreach (string item in subList)        {            Console.WriteLine(item);        }        Console.WriteLine();        dinosaurs.TrimExcess();        Console.WriteLine("\nTrimExcess()");        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);        Console.WriteLine("Count: {0}", dinosaurs.Count);        dinosaurs.Clear();        Console.WriteLine("\nClear()");        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);        Console.WriteLine("Count: {0}", dinosaurs.Count);        Console.ReadKey();    }}


注意其中的 Count Capacity的区别。

Count     :集合中有多少个元素。

Capacity:集合有多大的空间,就是指当前在不用调用resize的情况下可以容纳元素的最大个数。


BinarySearch:List<T>支持排序,在运行了Sort()方法后,可以使用BinarySearch进行二分查找。BinarySearch很有特点,如果元素没有找到,它会返回一个负整数,对该值进行按位取反(~),  就会得到"大于被查找元素的下一个元素的位置", 简单的说就是我们要找的元素可以被顺序插入的地方,这个特点可以让程序轻松的在保持集合排序的状态下,轻松的插入一个元素。执行BinarySearch的前提是一定要执行 Sort()函数。


FindAll:我们可以向集合传递一个委托的实例,用委托中的方法对集合进行过滤,产生一个新的目标集合。



Dictionary<TKey, TValue>

使用 名称/值 对应的方式来保存数据的。
MSDN <http://msdn.microsoft.com/en-us/library/xfhwa508.aspx>


注意如果 名称(或键值) 在Dictionary已经存在了,如果在向其添加值会引发异常。可以使用ContainsKey()进行检查。


代码实例:  Dictionary_Sample
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Dictionary_Sample{    class Program    {        static void Main(string[] args)        {            // Create a new dictionary of strings, with string keys.             //            Dictionary<string, string> openWith = new Dictionary<string, string>();            // Add some elements to the dictionary. There are no              // duplicate keys, but some of the values are duplicates.            openWith.Add("txt", "notepad.exe");            openWith.Add("bmp", "paint.exe");            openWith.Add("dib", "paint.exe");            openWith.Add("rtf", "wordpad.exe");            // The Add method throws an exception if the new key is              // already in the dictionary.             try            {                openWith.Add("txt", "winword.exe");            }            catch (ArgumentException)            {                Console.WriteLine("An element with Key = \"txt\" already exists.");            }            Console.WriteLine("\n");            // The Item property is another name for the indexer, so you              // can omit its name when accessing elements.             Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);            // The indexer can be used to change the value associated             // with a key.            openWith["rtf"] = "winword.exe";            Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);            Console.WriteLine("\n");            // If a key does not exist, setting the indexer for that key             // adds a new key/value pair.            openWith["doc"] = "winword.exe";            // The indexer throws an exception if the requested key is             // not in the dictionary.             try            {                Console.WriteLine("For key = \"tif\", value = {0}.", openWith["tif"]);            }            catch (KeyNotFoundException)            {                Console.WriteLine("Key = \"tif\" is not found.");            }            Console.WriteLine("\n");            // When a program often has to try keys that turn out not to             // be in the dictionary, TryGetValue can be a more efficient              // way to retrieve values.             string value = "";            if (openWith.TryGetValue("tif", out value))            {                Console.WriteLine("For key = \"tif\", value = {0}.", value);            }            else            {                Console.WriteLine("Key = \"tif\" is not found.");            }            Console.WriteLine("\n");            // ContainsKey can be used to test keys before inserting              // them.             if (!openWith.ContainsKey("ht"))            {                openWith.Add("ht", "hypertrm.exe");                Console.WriteLine("Value added for key = \"ht\": {0}", openWith["ht"]);            }            Console.WriteLine("\n");            // When you use foreach to enumerate dictionary elements,             // the elements are retrieved as KeyValuePair objects.            Console.WriteLine();            foreach (KeyValuePair<string, string> kvp in openWith)            {                Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);            }            Console.WriteLine("\n");            // To get the values alone, use the Values property.            Dictionary<string, string>.ValueCollection valueColl = openWith.Values;            // The elements of the ValueCollection are strongly typed             // with the type that was specified for dictionary values.            Console.WriteLine();            foreach (string s in valueColl)            {                Console.WriteLine("Value = {0}", s);            }            Console.WriteLine("\n");            // To get the keys alone, use the Keys property.            Dictionary<string, string>.KeyCollection keyColl = openWith.Keys;            // The elements of the KeyCollection are strongly typed             // with the type that was specified for dictionary keys.            Console.WriteLine();            foreach (string s in keyColl)            {                Console.WriteLine("Key = {0}", s);            }            Console.WriteLine("\n");            // Use the Remove method to remove a key/value pair.            Console.WriteLine("\nRemove(\"doc\")");            openWith.Remove("doc");            if (!openWith.ContainsKey("doc"))            {                Console.WriteLine("Key \"doc\" is not found.");            }            Console.ReadKey();        }    }}


SortedDictionary<TKey, TValue>

与Dictionary的使用基本一致 用名称/值 对应的方式来保存数据的,但它还有个特定,元素是按键值排好序的。
MSDN <http://msdn.microsoft.com/zh-cn/library/vstudio/f7fta44c.aspx>


代码实例:  SortedDictionary_Sample

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace SortedDictionary_Sample{    class Program    {        static void Main(string[] args)        {            // Create a new sorted dictionary of strings, with string            // keys.            SortedDictionary<string, string> openWith =                new SortedDictionary<string, string>();            // Add some elements to the dictionary. There are no             // duplicate keys, but some of the values are duplicates.            openWith.Add("txt", "notepad.exe");            openWith.Add("bmp", "paint.exe");            openWith.Add("dib", "paint.exe");            openWith.Add("rtf", "wordpad.exe");            // The Add method throws an exception if the new key is             // already in the dictionary.            try            {                openWith.Add("txt", "winword.exe");            }            catch (ArgumentException)            {                Console.WriteLine("An element with Key = \"txt\" already exists.");            }            // The Item property is another name for the indexer, so you             // can omit its name when accessing elements.             Console.WriteLine("For key = \"rtf\", value = {0}.",                openWith["rtf"]);            // The indexer can be used to change the value associated            // with a key.            openWith["rtf"] = "winword.exe";            Console.WriteLine("For key = \"rtf\", value = {0}.",                openWith["rtf"]);            // If a key does not exist, setting the indexer for that key            // adds a new key/value pair.            openWith["doc"] = "winword.exe";            // The indexer throws an exception if the requested key is            // not in the dictionary.            try            {                Console.WriteLine("For key = \"tif\", value = {0}.",                    openWith["tif"]);            }            catch (KeyNotFoundException)            {                Console.WriteLine("Key = \"tif\" is not found.");            }            // When a program often has to try keys that turn out not to            // be in the dictionary, TryGetValue can be a more efficient             // way to retrieve values.            string value = "";            if (openWith.TryGetValue("tif", out value))            {                Console.WriteLine("For key = \"tif\", value = {0}.", value);            }            else            {                Console.WriteLine("Key = \"tif\" is not found.");            }            // ContainsKey can be used to test keys before inserting             // them.            if (!openWith.ContainsKey("ht"))            {                openWith.Add("ht", "hypertrm.exe");                Console.WriteLine("Value added for key = \"ht\": {0}",                    openWith["ht"]);            }            // When you use foreach to enumerate dictionary elements,            // the elements are retrieved as KeyValuePair objects.            Console.WriteLine();            foreach (KeyValuePair<string, string> kvp in openWith)            {                Console.WriteLine("Key = {0}, Value = {1}",                    kvp.Key, kvp.Value);            }            // To get the values alone, use the Values property.            SortedDictionary<string, string>.ValueCollection valueColl =                openWith.Values;            // The elements of the ValueCollection are strongly typed            // with the type that was specified for dictionary values.            Console.WriteLine();            foreach (string s in valueColl)            {                Console.WriteLine("Value = {0}", s);            }            // To get the keys alone, use the Keys property.            SortedDictionary<string, string>.KeyCollection keyColl =                openWith.Keys;            // The elements of the KeyCollection are strongly typed            // with the type that was specified for dictionary keys.            Console.WriteLine();            foreach (string s in keyColl)            {                Console.WriteLine("Key = {0}", s);            }            // Use the Remove method to remove a key/value pair.            Console.WriteLine("\nRemove(\"doc\")");            openWith.Remove("doc");            if (!openWith.ContainsKey("doc"))            {                Console.WriteLine("Key \"doc\" is not found.");            }            Console.ReadKey();        }    }}


Stack<T>

后进先出的存储方式
MSDN <http://msdn.microsoft.com/en-us/library/3278tedw.aspx>


代码实例:  Stack_Sample

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Stack_Sample{    class Program    {        static void Main(string[] args)        {            Stack<string> numbers = new Stack<string>();            numbers.Push("one");            numbers.Push("two");            numbers.Push("three");            numbers.Push("four");            numbers.Push("five");            // A stack can be enumerated without disturbing its contents.             foreach (string number in numbers)            {                Console.WriteLine(number);            }            Console.WriteLine("\nPopping '{0}'", numbers.Pop());            Console.WriteLine("Peek at next item to destack: {0}", numbers.Peek());            Console.WriteLine("Popping '{0}'", numbers.Pop());            // Create a copy of the stack, using the ToArray method and the             // constructor that accepts an IEnumerable<T>.            Stack<string> stack2 = new Stack<string>(numbers.ToArray());            Console.WriteLine("\nContents of the first copy:");            foreach (string number in stack2)            {                Console.WriteLine(number);            }            // Create an array twice the size of the stack and copy the             // elements of the stack, starting at the middle of the              // array.              string[] array2 = new string[numbers.Count * 2];            numbers.CopyTo(array2, numbers.Count);            // Create a second stack, using the constructor that accepts an             // IEnumerable(Of T).            Stack<string> stack3 = new Stack<string>(array2);            Console.WriteLine("\nContents of the second copy, with duplicates and nulls:");            foreach (string number in stack3)            {                Console.WriteLine(number);            }            Console.WriteLine("\nstack2.Contains(\"four\") = {0}", stack2.Contains("four"));            Console.WriteLine("\nstack2.Clear()");            stack2.Clear();            Console.WriteLine("\nstack2.Count = {0}", stack2.Count);            Console.ReadKey();        }    }}


Queue<T>

先进先出的存储方式
MSDN <http://msdn.microsoft.com/en-us/library/7977ey2c.aspx>

代码实例:  Queue_Sample

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Queue_Sample{    class Program    {        static void Main(string[] args)        {            Queue<string> numbers = new Queue<string>();            numbers.Enqueue("one");            numbers.Enqueue("two");            numbers.Enqueue("three");            numbers.Enqueue("four");            numbers.Enqueue("five");            // A queue can be enumerated without disturbing its contents.             foreach (string number in numbers)            {                Console.WriteLine(number);            }            Console.WriteLine("\nDequeuing '{0}'", numbers.Dequeue());            Console.WriteLine("Peek at next item to dequeue: {0}", numbers.Peek());            Console.WriteLine("Dequeuing '{0}'", numbers.Dequeue());            // Create a copy of the queue, using the ToArray method and the             // constructor that accepts an IEnumerable<T>.            Queue<string> queueCopy = new Queue<string>(numbers.ToArray());            Console.WriteLine("\nContents of the first copy:");            foreach (string number in queueCopy)            {                Console.WriteLine(number);            }            // Create an array twice the size of the queue and copy the             // elements of the queue, starting at the middle of the              // array.              string[] array2 = new string[numbers.Count * 2];            numbers.CopyTo(array2, numbers.Count);            // Create a second queue, using the constructor that accepts an             // IEnumerable(Of T).            Queue<string> queueCopy2 = new Queue<string>(array2);            Console.WriteLine("\nContents of the second copy, with duplicates and nulls:");            foreach (string number in queueCopy2)            {                Console.WriteLine(number);            }            Console.WriteLine("\nqueueCopy.Contains(\"four\") = {0}", queueCopy.Contains("four"));            Console.WriteLine("\nqueueCopy.Clear()");            queueCopy.Clear();            Console.WriteLine("\nqueueCopy.Count = {0}", queueCopy.Count);            Console.ReadKey();        }    }}



LinkedList<T>

一个链表,支持正向和反向的遍历。

MSDN <http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx>

代码实例:  LinkedList_Sample

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace LinkedList_Sample{    class Program    {        static void Main(string[] args)        {            // Create the link list.             string[] words = { "the", "fox", "jumped", "over", "the", "dog" };            LinkedList<string> sentence = new LinkedList<string>(words);            Display(sentence, "The linked list values:");            Console.WriteLine("sentence.Contains(\"jumped\") = {0}", sentence.Contains("jumped"));            // Add the word 'today' to the beginning of the linked list.            sentence.AddFirst("today");            Display(sentence, "Test 1: Add 'today' to beginning of the list:");            // Move the first node to be the last node.            LinkedListNode<string> mark1 = sentence.First;            sentence.RemoveFirst();            sentence.AddLast(mark1);            Display(sentence, "Test 2: Move first node to be last node:");            // Change the last node be 'yesterday'.            sentence.RemoveLast();            sentence.AddLast("yesterday");            Display(sentence, "Test 3: Change the last node to 'yesterday':");            // Move the last node to be the first node.            mark1 = sentence.Last;            sentence.RemoveLast();            sentence.AddFirst(mark1);            Display(sentence, "Test 4: Move last node to be first node:");            // Indicate, by using parentheisis, the last occurence of 'the'.            sentence.RemoveFirst();            LinkedListNode<string> current = sentence.FindLast("the");            IndicateNode(current, "Test 5: Indicate last occurence of 'the':");            // Add 'lazy' and 'old' after 'the' (the LinkedListNode named current).            sentence.AddAfter(current, "old");            sentence.AddAfter(current, "lazy");            IndicateNode(current, "Test 6: Add 'lazy' and 'old' after 'the':");            // Indicate 'fox' node.            current = sentence.Find("fox");            IndicateNode(current, "Test 7: Indicate the 'fox' node:");            // Add 'quick' and 'brown' before 'fox':            sentence.AddBefore(current, "quick");            sentence.AddBefore(current, "brown");            IndicateNode(current, "Test 8: Add 'quick' and 'brown' before 'fox':");            // Keep a reference to the current node, 'fox',             // and to the previous node in the list. Indicate the 'dog' node.            mark1 = current;            LinkedListNode<string> mark2 = current.Previous;            current = sentence.Find("dog");            IndicateNode(current, "Test 9: Indicate the 'dog' node:");            // The AddBefore method throws an InvalidOperationException             // if you try to add a node that already belongs to a list.            Console.WriteLine("Test 10: Throw exception by adding node (fox) already in the list:");            try            {                sentence.AddBefore(current, mark1);            }            catch (InvalidOperationException ex)            {                Console.WriteLine("Exception message: {0}", ex.Message);            }            Console.WriteLine();            // Remove the node referred to by mark1, and then add it             // before the node referred to by current.             // Indicate the node referred to by current.            sentence.Remove(mark1);            sentence.AddBefore(current, mark1);            IndicateNode(current, "Test 11: Move a referenced node (fox) before the current node (dog):");            // Remove the node referred to by current.            sentence.Remove(current);            IndicateNode(current, "Test 12: Remove current node (dog) and attempt to indicate it:");            // Add the node after the node referred to by mark2.            sentence.AddAfter(mark2, current);            IndicateNode(current, "Test 13: Add node removed in test 11 after a referenced node (brown):");            // The Remove method finds and removes the             // first node that that has the specified value.            sentence.Remove("old");            Display(sentence, "Test 14: Remove node that has the value 'old':");            // When the linked list is cast to ICollection(Of String),             // the Add method adds a node to the end of the list.            sentence.RemoveLast();            ICollection<string> icoll = sentence;            icoll.Add("rhinoceros");            Display(sentence, "Test 15: Remove last node, cast to ICollection, and add 'rhinoceros':");            Console.WriteLine("Test 16: Copy the list to an array:");            // Create an array with the same number of             // elements as the inked list.             string[] sArray = new string[sentence.Count];            sentence.CopyTo(sArray, 0);            foreach (string s in sArray)            {                Console.WriteLine(s);            }            // Release all the nodes.            sentence.Clear();            Console.WriteLine();            Console.WriteLine("Test 17: Clear linked list. Contains 'jumped' = {0}",                sentence.Contains("jumped"));            Console.ReadKey();        }        private static void Display(LinkedList<string> words, string test)        {            Console.WriteLine(test);            foreach (string word in words)            {                Console.Write(word + " ");            }            Console.WriteLine();            Console.WriteLine();        }        private static void IndicateNode(LinkedListNode<string> node, string test)        {            Console.WriteLine(test);            if (node.List == null)            {                Console.WriteLine("Node '{0}' is not in the list.\n", node.Value);                return;            }            StringBuilder result = new StringBuilder("(" + node.Value + ")");            LinkedListNode<string> nodeP = node.Previous;            while (nodeP != null)            {                result.Insert(0, nodeP.Value + " ");                nodeP = nodeP.Previous;            }            node = node.Next;            while (node != null)            {                result.Append(" " + node.Value);                node = node.Next;            }            Console.WriteLine(result);            Console.WriteLine();        }    }}