System.Collections 常用类,接口和结构:
类:ArrayList,HashTable,SortedList
接口:ICollection,IEnumerator,IList
结构:DictionaryEntry
类:
ArrayList: 数组列表,是Array类的优化版本。。
Hashtable: 一种数据结构,将数据作为一组键(Key)值(Value)来存储,Hash表中数据将会根据Key来建立索引,一般用来存储几万,几十万条数据,数据搜索性能高。
SortedList: 一种排序的数据列表,也是将数据作为一组键(Key)值(Value)来存储,也会根据Key来建立索引,一般用来存储几百,几千条数据,当存储几万条是数据的搜索性能就会降低,因此超过上万建议使用Hashtable。
接口:
ICollection:定义了一组管理元素的函数,如添加,删除等等。
IEnumerator:继承于ICollection,因此具有管理元素的功能,且添加了新的功能,既可以通过他来遍力元素。
IList:继承于IEnumerator,因此具有管理,遍力且新加了通过索引查找元素。
结构:
DictionaryEntry:一个结构体,包括了一个键(Key)和值(Value)变量,既键值对。Hashtable和SortedList的变量数据类型为DictionaryEntry。因此可以通过DictionaryEntry来遍力Hashtable和SortedList。
* Hashtable示例 */
/* 4种遍力Hashtable的方法 */
/* 题目描述:添加员工资料到Hasttable,将姓名添加到列表框,点击列表框中的名字则显示该员工的资料。并可以删除该员工的资料 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace HashEmpManager
{
public partial class frmEmpManger : Form
{
private Hashtable _hashtable = new Hashtable(); // 创建一个哈希表对象
public frmEmpManger()
{
InitializeComponent();
}
private void btnAdd_Click(object sender, EventArgs e)
{
/* 判断数据输入是否完整 */
if ((txtName.Text == "") || (txtID.Text == "") || (txtDept.Text == "") || (txtSalary.Text == ""))
{
MessageBox.Show("员工资料不能为空!", "错误");
return;
}
EmpInfor emp = new EmpInfor();
/* 员工资料赋值 */
emp.ID = txtID.Text;
emp.Name = txtName.Text;
emp.Dept = txtDept.Text;
emp.Salary = txtSalary.Text;
/* 当添加相同编号的ID时,则捕捉这个异常 */
try
{
/* 将emp对象作为值添加到哈希表中,键为emp.ID, 哈希表分键和值2部分 */
_hashtable.Add(emp.ID, emp);
}
catch (ArgumentException ex)
{
MessageBox.Show("不能添加重复的员工ID", "错误");
return;
}
/* 将员工的姓名添加到列表框中 */
lstEmpInfor.Items.Add(emp.Name);
/* 清空文本框 */
txtName.Text = null;
txtID.Text = null;
txtDept.Text = null;
txtSalary.Text = null;
}
private void btnCancle_Click(object sender, EventArgs e)
{
Application.Exit(); // 退出程序
}
private void btnRelease_Click(object sender, EventArgs e)
{
string strName = (string)lstEmpInfor.SelectedItem; // 获得列表框选中的值
foreach (string key in _hashtable.Keys)
{
if (strName == ((EmpInfor)_hashtable[key]).Name) // 如果与列表框中选中的姓名相等,则给文本框赋值
{
_hashtable.Remove(key); // 删除哈希表中的项
lstEmpInfor.Items.Remove(lstEmpInfor.SelectedItem); // 从列表框中删除员工姓名
/* 清空文本框 */
txtName.Text = null;
txtID.Text = null;
txtDept.Text = null;
txtSalary.Text = null;
break; // 退出循环
}
}
}
/* 在文本框中显示选中的哈希表中的值 */
private void lstEmpInfor_SelectedIndexChanged(object sender, EventArgs e)
{
string strName = (string)lstEmpInfor.SelectedItem; // 获得选中列表框中的值
// 遍历法一:
/* 遍历哈希表中的键,其值为string */
foreach (string key in _hashtable.Keys)
{
/* 注:因为_hashtable[key]).Name返回类型为Object,所以要强制转换为EmpInfor对象 */
if (strName == ((EmpInfor)_hashtable[key]).Name) // 如果与列表框中选中的姓名相等,则给文本框赋值
{
txtID.Text = ((EmpInfor)_hashtable[key]).ID;
txtName.Text = ((EmpInfor)_hashtable[key]).Name;
txtDept.Text = ((EmpInfor)_hashtable[key]).Dept;
txtSalary.Text = ((EmpInfor)_hashtable[key]).Salary;
break; // 退出循环
}
}
// 遍历法二:
/* 遍历哈希表中的值,其值为EmpInfor对象 */
//foreach (EmpInfor emp in _hashtable.Values)
//{
// if (strName == emp.Name) // 如果与列表框中选中的姓名相等,则给文本框赋值
// {
// txtID.Text = emp.ID;
// txtName.Text = emp.Name;
// txtDept.Text = emp.Dept;
// txtSalary.Text = emp.Salary;
// break; // 退出循环
// }
//}
// 遍历法三:
/* 遍历哈希表中的健值,其健值为DictionaryEntry对象 */
//foreach (DictionaryEntry DE in _hashtable)
//{
// /* 注:DictionaryEntry是一个结构体,存储了一个Key(键)和一个Value(值),称为键值对,
// * 而Hashtable和SortedList中的变量的数据类型就是DictionaryEnty,所以可以那样遍力 */
// if (strName == ((EmpInfor)DE.Value).Name)
// {
// txtID.Text = ((EmpInfor)DE.Value).ID;
// txtName.Text = ((EmpInfor)DE.Value).Name;
// txtDept.Text = ((EmpInfor)DE.Value).Dept;
// txtSalary.Text = ((EmpInfor)DE.Value).Salary;
// break; // 退出循环
// }
//}
// 遍历法四:
/* 遍历哈希表中的健值,其健值为IDictionaryEnumerator对象 */
//IDictionaryEnumerator myEnum = _hashtable.GetEnumerator();
//while (myEnum.MoveNext())
//{
// /* IDictionaryEnumerator我想是继承了IDictionary和IEnumerator2个接口 */
// EmpInfor empEnum = (EmpInfor)_hashtable[myEnum.Key];
// if (strName == empEnum.Name)
// {
// txtID.Text = empEnum.ID;
// txtName.Text = empEnum.Name;
// txtDept.Text = empEnum.Dept;
// txtSalary.Text = empEnum.Salary;
// break; // 退出循环
// }
//}
}
}
public class EmpInfor // 定义一个员工类
{
private string _empID; // ID
private string _empName; // 姓名
private string _empDept; // 部门
private string _empSalary; // 工资
public string ID // 定义ID属性
{
set // 设置ID
{
_empID = value;
}
get // 获得ID
{
return _empID;
}
}
public string Name // 定义姓名属性
{
set
{
_empName = value;
}
get
{
return _empName;
}
}
public string Dept // 定义部门属性
{
set
{
_empDept = value;
}
get
{
return _empDept;
}
}
public string Salary // 定义工资属性
{
set
{
_empSalary = value;
}
get
{
return _empSalary;
}
}
}
}
/* SortedList的示例: */
/* 包括遍力SortedList和GetType()方法 */
using System;
using System.Collections;
namespace SortedListHere
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class SortedListExample
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
// 创建SortedList 对象
SortedList objCarDetails = new SortedList( );
// 添加值
objCarDetails.Add( "1991", new Car( "1991", "宝马" ) );
objCarDetails.Add( "1992", new Car( "1992", "夏利" ) );
objCarDetails.Add( "2002", new Car( "2002", "雪弗莱" ) );
objCarDetails.Add( "1998", new Car( "1998", "金杯" ) );
// 通过ArrayList获得Keys,然后对Keys排序,最后再来遍历
ArrayList akeys = new ArrayList( objCarDetails.Keys );
akeys.Sort( );
foreach( string skey in akeys )
{
Car objCar = (Car)objCarDetails[skey];
Console.WriteLine( objCar.Name );
}
Console.WriteLine( "\n" );
// 通过Keys遍历 利用到SortList的索引
foreach( string strKey in objCarDetails.Keys )
{
Console.WriteLine( ( (Car)objCarDetails[strKey] ).Name );
}
Console.WriteLine( "\n" );
// 通过Values遍历 就不能利用到SortList的索引了。。
foreach( Car objCar in objCarDetails.Values )
{
Console.WriteLine( objCar.Name );
}
Console.WriteLine( "\n" );
// ToString( ) 返回对象类型
Console.WriteLine( objCarDetails.ToString( ) );
// GetType( ) 获得对象的类型,及类型的类型,如果对象为Car, 则GetType()则获得Car的属性和方法
Car car3 = new Car( "2002", "雪弗莱" );
/* 获得Car对象的属性名称 */
Console.WriteLine( car3.GetType().GetProperties()[0].Name );
Console.WriteLine( "\n" );
// 通过DictionaryEntry遍历
foreach( DictionaryEntry objDE in objCarDetails )
{
Console.WriteLine( objDE.Key );
Console.WriteLine( objDE.Value );
Console.WriteLine( ( (Car)objDE.Value ).Name );
}
int i = 1;
while ( i == 1 )
{
Console.Write( "输入汽车的型号:" );
string model = Console.ReadLine( );
// 检查是否存在该值
if ( objCarDetails.ContainsKey( model ) )
{
// 搜索型号并从排序列表中获取对象
Car objCar = (Car)objCarDetails.GetByIndex( objCarDetails.IndexOfKey( model ) ); // 获得该型号的对象
Console.WriteLine( "顺序 = {0}",objCarDetails.IndexOfKey( model ) ); // 显示在SortList中的位置
Console.WriteLine( "汽车名称 = {0}", objCar.Name ); // 显示名字
// 第二种方式通过key获得对象并输出名字
Console.WriteLine( "汽车名称 = {0}", ( (Car)objCarDetails[model] ).Name );
}
else
{
Console.WriteLine( "型号未找到" );
}
Console.WriteLine( "输入1继续,输入0退出" );
i = Convert.ToInt32( Console.ReadLine( ) );
}
Console.ReadLine( );
}
}
public class Car
{
private string _carModel;
private string _carName;
public Car( string carModel, string carName )
{
_carModel = carModel;
_carName = carName;
}
// 获取_carModel值
public string Model
{
get
{
return _carModel;
}
}
// 获取_carName值
public string Name
{
get
{
return _carName;
}
}
}
}