数组大小固定,初始化必须指定长度,所以当元素数量动态变化时应使用集合类。
泛型集合类位于: System.Collections.Generic
线程安全集合类位于:System.Collections.Concurrent
特定类型集合类位于:System.Collections.Specialized
集合可以根据集合类实现的接口 组合为列表、集合、字典。
集合和列表实现的部分常用接口如下:
用foreach遍历集合时,需用到IEnumerable接口,用GetEnummerator()方法返回实现IEnumerator接口的枚举。
当需得到集合中的元素个数Count属性,或需增加和删除元素时,需实现ICollection<T>接口。
当集合需在指定位置插入和删除时,需实现IList<T>接口,派生自ICollection<T>。
当需对集合中的元素进行排序时,需实现IComparer<T>接口。
当需支持线程安全的集合类时需实现接口IProducerConsumerCollection<T>接口。
动态列表提供了泛型类List<T>,该类实现了IList<T>、ICollection<T>、IEnumerable<T>接口。
默认容量4,容量自增2倍。容量改变,整个集合需重新分配内存,为节省时间,如果事先知道元素个数,
可用构造函数定义其容量。当元素数量小于容量的90%(大概值),可用TrimExcess()方法去除不需要的容量,
超过90%时,TrimExcess()没有意义,因为重新分配内存需要时间。
集合类型的转换需调用ConvertAll<TOutput>()方法。
创建只读集合需调用AsReadOnly()方法,返回ReadOnlyCollection<T>对象。
有序列表SortedList<TKey,Tvalue>,键值一一对应。如果一个键需对应多个值,用Lookup<TKey,TValue>替代。
队列使用System.Collections.Generic名称空间中的泛型类Queue<T>实现,FIFO。实现了ICollection和 IEnumerable<T>接口,
没有实现ICollection<T>接口,因为队列没有Add()和Remove()方法。
默认容量32,容量自增4。
栈Stack<T>,LIFO。实现了ICollection和IEnumerable<T>接口,默认容量10,容量自增2倍。
双向链表LinkList:链式存储结构,包含LinkedListNode<T>节点对象,该对象存着与当前节点相关的链表对象 LinkList<T>,还存着指针域的两个指针next和previous和节点当前值value。
优点:插入,删除效率高,只需修改指针域的前驱节点和后继节点即可进行插入删除。
缺点:无法基于位置索引,必须从头结点依次遍历。
字典Dictionary<TKey,TValue>,以键值对访问数据,为散列表也称哈希表。可基于键快速查找,类似于 List<T>,但无内存中移动后续元素的性能开销。字典的键必须重写Object类的GetHashCode()方法,字典的性能取决于GetHashCode()(哈希函数)的实现。这个函数的值分布越均匀,越少出现哈希碰撞则越好。
有序字典SortedDictionary<TKey,TValue>,为二叉搜索树,元素根据键排序,键类型需实现IComparable<TKey>。
包含不重复元素的集合称为集(set),需实现ISet<T>接口。
HashSet<T>集包含不重复元素的无序列表,SortedSet<T>集包含不重复元素的有序列表。
可观察的集合ObservableCollection<T>类,命名空间为System.Collections.ObjectModel。每当进行插入删除,即可进行监听。
位数组有BitArray类和BitVector32结构。BitArray类位于System.Collections中,BitVector32结构位于名称空间System.Collections.Specialized中。BitArray类可重新设置位数大小,每32位为一个整数,BitVector32结构仅包含32位,存储在一个整数中。
BitArray类可按位进行与、或、异或、取反等。
BitVector32结构可设置片段。
片段int转二进制字符串
int ri = int.Parse(Console.ReadLine());
string result = IntToBinaryString(ri, true);
Console.WriteLine(result);
private static string IntToBinaryString(int val , bool removeStartZero)
{
var sb = new StringBuilder(32);
for (int i = 0; i < 32; i++) {
if ((val & 0x80000000) != 0)
{
sb.Append(1);
}
else {
sb.Append(0);
}
val = val << 1;
}
string s = sb.ToString();
if (removeStartZero) {
return s.TrimStart('0');
}
else {
return s;
}
}
并发集合位于System.Collections.Concurrent。常用对象类有BlockingCollection<T>,使用Add和Take方法来添加删除元素,这两个方法是线程阻塞性的。
总结:需根据不同的功能需求结合各集合对象的自身特点去使用不同的集合对象,降低操作的时间复杂度和内存空间的消耗。