C# List<T> 合并、去重、查找

原文链接:http://www.cnblogs.com/DONET-LC/p/6245125.html

 List<int> listA = new List<int> {1,2,3,5,7,9};
 List<int> listB = new List<int> {13,4,17,29,2};


 listA.AddRange(listB );//把集合A.B合并
 List<int> Result = listA.Union(listB).ToList<int>();          //剔除重复项 
 List<int> Result = listA.Concat(listB).ToList<int>();        //保留重复项

 listA.BinarySearch("1");//判断集合中是否包含某个值.如果包含则返回0
<think>嗯,用户想了解C#中的集合类型及其用法。首先,我需要回忆一下C#中的主要集合类,然后根据提供的引用资料来组织信息。用户提供的引用中提到了ArrayList、List、LinkedList、Queue、Stack、HashSet、SortedSet、Hashtable、Dictionary、SortedDictionary等。这些应该涵盖常用的集合类型。 首先,应该分类讨论,分为非泛型集合和泛型集合。根据引用[2],非泛型集合如ArrayList和Hashtable,而泛型集合如List<T>和Dictionary<TKey, TValue>。需要注意泛型集合的优势,比如类型安全和性能提升。引用[3]也提到List、Dictionary、HashSet、Queue、Stack,这些都是需要详细说明的。 接下来,每个集合类型的用途和特点需要简要说明。例如,ArrayList是动态数组,但类型不安全;List<T>是泛型版本,更安全。LinkedList<T>是双向链表,插入删除高效。Queue和Stack是FIFO和LIFO结构。HashSet用于不复元素,支持集合运算。Dictionary是键值对,而SortedDictionary是有序版本。 还要注意引用[4]提到的Dictionary<TKey, TValue>是Hashtable的泛型版本,使用KeyValuePair结构。同时,引用[5]提到了IEnumerable和IEnumerator接口,可能需要在迭代部分提到。 用户可能需要示例代码来理解用法,所以每个类型最好给出简单的代码示例,比如添加元素、遍历等。例如,List<T>的Add方法,Dictionary的键值对添加和访问。 另外,需要强调非泛型集合与泛型集合的区别,比如类型安全和性能,避免装箱拆箱。引用[2]提到集合类创建的是Object对象,所以非泛型集合存在类型安全问题,而泛型集合解决了这个问题。 最后,应用场景部分需要说明不同集合的使用情况,比如Queue用于任务队列,Stack用于撤销操作,Dictionary用于键值存储等。可能还需要提到线程安全集合,但用户提供的引用中没有太多信息,可能暂时不提。 总结一下,结构应该是先分类,再逐个介绍每个集合的特点、用法、示例代码,最后总结应用场景。同时,要引用提供的资料来支持内容,比如引用[3]对集合类型的概述,引用[4]对Dictionary的说明等。 需要注意用户可能对非泛型和泛型的区别不太清楚,需要明确解释。同时,代码示例要符合C#语法,比如使用泛型类型参数,正确的初始化方式等。例如,List<int>的示例,Dictionary<string, int>的键值对操作。 可能还需要提到一些接口,如IEnumerable,但引用[5]中的IEnumerator接口可能不需要深入,除非用户特别问到迭代机制。在回答中,可以简要提到foreach循环依赖于IEnumerable。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如如何选择集合类型,线程安全集合有哪些,性能比较等。根据现有的引用,可能的问题包括集合的选择依据、不同集合的性能差异、如何实现自定义集合等。</think>### C# 集合类型及用法详解 C# 集合类型可分为 **非泛型集合** 和 **泛型集合** 两大类,分别位于 `System.Collections` 和 `System.Collections.Generic` 命名空间[^2][^3]。以下是常用集合类型及其核心用法: --- #### 一、非泛型集合(已逐渐被泛型替代) 1. **ArrayList(动态数组)** - **用途**:动态调整大小的数组,支持任意类型元素。 - **缺点**:类型不安全,需频繁装箱/拆箱。 ```csharp ArrayList list = new ArrayList(); list.Add("字符串"); list.Add(100); // 允许混合类型 ``` 2. **Hashtable(哈希表)** - **用途**:键值对存储,通过哈希算法快速检索。 ```csharp Hashtable table = new Hashtable(); table["key1"] = "value1"; object value = table["key1"]; ``` --- #### 二、泛型集合(推荐使用) 1. **List\<T\>(泛型动态数组)** - **特点**:类型安全,高效内存管理。 - **示例**: ```csharp List<int> numbers = new List<int>(); numbers.Add(10); numbers.Remove(10); foreach (int num in numbers) { /* 遍历 */ } ``` 2. **Dictionary\<TKey, TValue\>(泛型字典)** - **用途**:键值对集合,基于哈希表实现[^4]。 - **示例**: ```csharp Dictionary<string, int> scores = new Dictionary<string, int>(); scores.Add("Alice", 90); int aliceScore = scores["Alice"]; ``` 3. **LinkedList\<T\>(双向链表)** - **用途**:频繁插入/删除操作的场景。 - **示例**: ```csharp LinkedList<string> chain = new LinkedList<string>(); chain.AddLast("Node1"); chain.AddFirst("Node0"); ``` 4. **Queue\<T\>(队列)** - **规则**:先进先出(FIFO)。 ```csharp Queue<int> queue = new Queue<int>(); queue.Enqueue(1); int first = queue.Dequeue(); ``` 5. **Stack\<T\>(栈)** - **规则**:后进先出(LIFO)。 ```csharp Stack<string> stack = new Stack<string>(); stack.Push("Item1"); string top = stack.Pop(); ``` 6. **HashSet\<T\>(无序唯一集合)** - **用途**:、集合运算(并集、交集)。 ```csharp HashSet<int> set1 = new HashSet<int>() { 1, 2, 3 }; HashSet<int> set2 = new HashSet<int>() { 3, 4, 5 }; set1.UnionWith(set2); // 合并后 set1 = {1,2,3,4,5} ``` 7. **SortedDictionary\<TKey, TValue\>(有序字典)** - **特点**:按键排序的字典,基于红黑树实现。 ```csharp SortedDictionary<int, string> sortedDict = new SortedDictionary<int, string>(); sortedDict.Add(2, "Two"); sortedDict.Add(1, "One"); // 自动按Key排序:1 → 2 ``` --- #### 三、集合的迭代与接口 所有集合类型均实现了 **`IEnumerable` 接口**,支持 `foreach` 遍历[^5]。例如: ```csharp foreach (KeyValuePair<string, int> entry in scores) { Console.WriteLine($"{entry.Key}: {entry.Value}"); } ``` --- #### 四、应用场景对比 | 集合类型 | 典型场景 | |-------------------|----------------------------------| | `List<T>` | 需要快速随机访问的动态列表 | | `Dictionary<T,K>` | 按键快速查找的键值存储(如缓存) | | `Queue<T>` | 任务队列、消息处理 | | `HashSet<T>` | 数据、集合运算 | | `LinkedList<T>` | 高频插入/删除(如撤销操作历史) | --- #### 五、选择依据 1. 需要键值对?→ 选择 `Dictionary` 或 `SortedDictionary` 2. 需要唯一元素?→ 选择 `HashSet` 3. 需要顺序访问?→ 选择 `List` 或 `LinkedList` 4. 线程安全需求?→ 使用 `ConcurrentBag`、`ConcurrentQueue` 等并发集合(位于 `System.Collections.Concurrent`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值