第十章 集合
今天差一点就直接睡觉去了。冬天实在太冷,总是给自己找好多理由。还好,继续今天的复习。
集合 以前用的也只有那几样,殊不知有很多连概念都不知道。同事说看书没用,我反驳:那是因为你没看。
一 列表List<T>
1.ForEach用法
racers.ForEach(delegate(Racer r){Console.WriteLine(r.ToString)});
或者使用λ表达式 racers.ForEach (r=>Console.WriteLine(r.ToString));
2. 类型转换
List<Person> persons = racers.ConvertAll<Person>(r=> new Person(r.Firstname+" "+r.Lastname));
3. 只读集合
List<T> 的AsReadOnly 方法返回ReadOnlyCollection<T>只读对象。
二 队列 Queue,Queue<T> 先进先出
Enqueue() 在一端添加元素
Dequeue() 在另一端删除元素
三 栈 Statck, Statck<t> 先进后出
Push() 在栈顶添加元素
Pop() 在栈顶删除元素
四 链表 LinkedList<T> 没有非泛型集合的类似版本
双向链表,其元素指向前后和后面的元素。
优点:插入的速度非常快,因为只需要修改插入元素的上一个元素的Next引用和下一个元素的Previous引用。
缺点: 因为只能一个接一个地访问,所以查找中间或尾部的元素需要较长的时间。
遗留问题: 书上的Linkedlist demo 没有弄明白
五 有序表
SortedList<Tkey,TValue>, SortedList 排好序的集合
六 字典 (平时用的最多的)
注意: 字典的性能取决于GetHashCode()方法
每当重写 Object的Equals()方法是,系统会给出一个警告提示重写 GetHashCode()。因为如果两个对象相等,则他们必须返回相同的散列码。
1.Lookup类
字典每个键支持一个值。而Lookup 的每一个键映射到一个值集上。
Lookup 不能像一般的字典那样创建,必须调用ToLookup().它返回一个Lookup对象。
该方法用于实现了IEnumerable<T>的所有类。
Lookup<string,Racer> lookupRacers=(Lookup<string,Racer>)racers.ToLookup(r=>r.Country)
foreach(Racer r in lookupRacers["Australia"])
{
Console.WriteLine(r);
}
2.其他字典类
有一些非泛型的字段 例如 Hashtable 值和键基于object 等等
泛型字典优先于基于对象的字典。所以还是多使用泛型字典
SortedList<TKey,TValue> 实现为一个基于数组的链表
SortedDictionary<TKey,TValue> 实现为一个字典。
SortedList使用的内存比SortedDictionary少;
SortedDictionary的插入删除比较快;
在用以排好序的数据填充集合时,若不需要修改容量,SortedList 比较快。
七 HashSet
这个集合包含不重复项的无序列表。这个类提供的方法可以创建合集和交集。
Add() 方法返回bool值。如果不存在,添加元素返回true,如果已经存在,返回false
IsSubsetOf()返回bool值。如果参数传送的集合是集的一个子集。返回true
IsSupersetOf()返回bool值。如果参数传送的集合是集的一个超集,返回true
UnionWith() 合并子集。合并后的集合中只包含唯一值。
八 位数组
类BitArray 和 结构BitVector32
BitArray 可以重新设置大小,利用Length属性设置。
BitVector32 基于栈的,所以速度比较快。仅包含32位,存储在一个整数中。
九 性能