C#泛型
来源:互联网 发布:淘宝学历证书 编辑:程序博客网 时间:2024/06/12 00:27
System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。
System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。
System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。
泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱。
很多非泛型集合类都有对应的泛型集合类,我觉得最好还是养成用泛型集合类的好习惯,他不但性能上好而且 功能上要比非泛型类更齐全。下面是常用的非泛型集合类以及对应的泛型集合类:
非泛型集合类 泛型集合类
ArrayList List<T>
HashTable DIctionary<T>
Queue Queue<T>
Stack Stack<T>
SortedList SortedList<T>
我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类,其中当我们经常性的操作数据信息时往往用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,他给我们的帮助应该是非常大的,如果我们操纵的数据类型相对确定的化 用Dictionary<TKey,TValue>集合类来存储数据就方便多了,例如我们需要在电子商务网站中存储用户的购物车信息( 商品名,对应的商品个数)时,完全可以用Dictionary<string,int > 来存储购物车信息,而不需要任何的类型转化
Hashtable 用法
在 .NET Framework 中, Hashtable 是 System.Collections 命名空间提供的一个容器,用于处理和表现类似 key/value 的键值对,其中 key 通常可用来快速查找,同时 key 是区分大小写; value 用于存储对应于 key 的值。 Hashtable 中 key/value 键值对均为 object 类型,所以 Hashtable 可以支持任何类型的 key/value 键值对 . 。
在哈希表中添加一个 key/value 键值对: HashtableObject.Add(key,value);
在哈希表中去除某个 key/value 键值对: HashtableObject.Remove(key);
从哈希表中移除所有元素: HashtableObject.Clear();
判断哈希表是否包含特定键 key : HashtableObject.Contains(key);
Hashtable ht = new Hashtable ();
ht .Add ("a" , 123);
ht .Add ("b" , 456);
// 遍历哈希表需要用到DictionaryEntry Object
foreach (DictionaryEntry de in ht )
{
MessageBox .Show (de .Key .ToString () + " " + de .Value .ToString ());
}
// 对哈希表进行排序
ArrayList akeys = new ArrayList (ht .Keys ); // 别忘了导入System.Collections
akeys .Sort (); // 按字母顺序进行排序
foreach (string skey in akeys )
{
MessageBox .Show (skey + ":" );
MessageBox .Show (ht [skey ].ToString ());// 排序后输出
}
ArrayList 用法
private static void AddToList (ArrayList list , string p )
{
if (list .Contains (p ) == false )
list .Add (p );
}
private void button1_Click (object sender , EventArgs e )
{
ArrayList list = new ArrayList ();
AddToList (list , "Table1" );
AddToList (list , "Table4" );
AddToList (list , "Table1" );
AddToList (list , "Table3" );
AddToList (list , "Table2" );
AddToList (list , "Table2" );
foreach (string s in list )
{
MessageBox .Show (s );
}
}
List
List <string > listStr = new List <string >();
listStr .Add ("123" );
listStr .Add ("456" );
listStr .Add ("789" );
MessageBox .Show (listStr [2]);// ” 789 ”
Dictionary
泛型的优点( C# 编程指南)
C# 中典型的范型结构除了熟悉的 IList , HashTable 之外还有一个并不常见的Dictionary 集合。
相比较而言,Dictionary 的性能是最好的,也属于轻便型的集合。效率要大于HashTable ,其主要原因是Dictionary 支持强类型声明的。
在公共语言运行库和 C# 语言的早期版本中,通用化是通过在类型与通用基类型 Object 之间进行强制转换来实现的,泛型提供了针对这种限制的解决方案。通过创建泛型类,您可以创建一个在编译时类型安全的集合。
添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object 。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。
对于客户端代码,与 ArrayList 相比,使用 List<T> 时添加的唯一语法是声明和实例化中的类型参数。虽然这稍微增加了些编码的复杂性,但好处是您可以创建一个比 ArrayList 更安全并且速度更快的列表,特别适用于列表项是值类型的情况。
Dictionary 泛型类提供了从一组键到一组值的映射。字典中的每个添加项都由一个值及其相关联的键组成。通过键来检索值的速度是非常快的,接近于 O(1) ,这是因为 Dictionary 类是作为一个哈希表来实现的。
1 、 Dictionary <int , string > fruit = new Dictionary <int , string >();
// 加入重复键会引发异常
fruit .Add (1, " 苹果" );
fruit .Add (2, " 桔子" );
fruit .Add (3, " 香蕉" );
fruit .Add (4, " 菠萝" );
// 因为引入了泛型,所以键取出后不需要进行Object 到int 的转换,值的集合也一样
foreach (int i in fruit .Keys )
{
MessageBox .Show (" 键是:" +i .ToString ()+ " 值是:" + fruit [i ]);
}
2 、 Dictionary <string , string > fruit = new Dictionary <string , string >();
// 加入重复键会引发异常
fruit .Add ("1" , " 苹果" );
fruit .Add ("2" , " 桔子" );
fruit .Add ("3" , " 香蕉" );
fruit .Add ("4" , " 菠萝" );
// 因为引入了泛型,所以键取出后不需要进行Object 到int 的转换,
值的集合也一样
foreach (string i in fruit .Keys )
{
MessageBox .Show (" 键是:" +i .ToString ()+ " 值是:" + fruit [i ]);
}
- C#泛型
- c#泛型
- C# 泛型
- C#泛型
- C# 泛型
- C#泛型
- C# 泛型
- C# 泛型
- C# 泛型
- c# 泛型
- C# 泛型
- C# 泛型
- C#泛型
- C# 泛型
- C# - 泛型
- C#泛型
- C#泛型
- C# 泛型
- 凸面体网格(convex mesh)
- 使用CAS实现SSO.
- 页面异步更新 可能会影响隐藏域中的值
- 用javascript接收QueryString
- ASP.NET程序中常用的三十三种代码
- C#泛型
- 数据库中乐观锁与悲观锁的概念
- PHP的垃圾收集机制
- 编程之美笔记——光影切割问题
- [sql server] 根据周期得到时间范围
- 通用系统在中国死路一条
- 如何判断Ext.window已经显示
- PHP对MYSQL数据库进行事务处理及表锁定
- 详解C#中访问私有成员