前言:漫长的国庆长假终于快结束了,我们该工作的工作了,该学习的学习了,该干什么的也都开始了,这篇博客我主要说一下C#中集合的使用,也就是ArrayList集合和Hashtable字典集合的使用,我在这里说的主要还是简单的使用,使学习的能够很快的学习集合然后自己研究集合的一些高级用法,在最后还列举出了一些常用的小案例。
- ArrayList
(1) 命名空间 System.Collection
(2)创建对象
1)增
->Add
->AddRange 任何一个集合对象
int[] num = { 1, 2, 3, 4, 5, 6 };
ArrayList arr = new ArrayList();
//ICollection一个对象里面包含很多其他对象
arr.AddRange(num);
->Insert
2)删
->Remove
->RemoveAt
->Clear
3)改
->像数组一样通过索引来修改
4)查
->Contains
->IndexOf
- 自定义集合
(1) 集合是Object类型,处理数据的时候会需要强转等操作
(2)举例说明:
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | 1)新建一个Person类
class Person
{
public string Name { get ; set ; }
public int Age { get ; set ; }
public char Gender { get ; set ; }
public Person( string n, int a, char g)
{
Name = n;
Age = a;
Gender = g;
}
public void SayHello()
{
Console.WriteLine( "我叫{0}" , Name);
}
}
2)新建一个PeresonCollection类
class PersonCollection
{
ArrayList arr = new ArrayList();
public void Add(Person p)
{
arr.Add(p);
}
public void AddRange( params Person[] ps)
{
arr.AddRange(ps);
}
public Person this [ int index]
{
get { return (Person)arr[index]; }
}
public int Count
{
get { return arr.Count; }
}
}
3)在main方法中实现
static void Main( string [] args)
{
PersonCollection ps = new PersonCollection();
ps.Add( new Person( "韩迎龙" , 23, '男' ));
ps.Add( new Person( "韩全龙" , 16, '男' ));
ps.Add( new Person( "泛亚内" , 16, '男' ));
ps.Add( new Person( "野田" , 16, '男' ));
for ( int i = 0; i < ps.Count; i++)
{
ps[i].SayHello();
}
Console.ReadKey();
}
|
(3)定义索引
1)就是一个通过传进来的参数访问内部数据的一个属性(带有参数的属性)
2)public 返回类型 this[索引参数类型 参数名]
{
get{return 通过参数访问的数据;}
set{通过参数处理要修改的数据=value}
}
案例说明:
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | class Arr
{
int [] nums = { 10, 23, 34, 45, 56 };
public int this [ int index]
{
get {
if (index > nums.Length - 1)
{
throw new Exception( "索引超出异常" );
}
return nums[index];
}
set { nums[index] = value; }
}
public int Count
{
get { return nums.Length; }
}
}
class IndexString
{
int num = 10;
string str = "字符串韩迎龙" ;
char ch = 'c' ;
public int this [ int index]
{
get { return num; }
}
public string this [ string str]
{
get { return this .str; }
}
public char this [ char c]
{
get { return ch; }
}
public string this [ int n, char c, string s]
{
get { return num + str + ch; }
}
}
class Program
{
static void Main( string [] args)
{
IndexString IS= new IndexString();
Console.WriteLine(IS[ ' ' ]);
Console.WriteLine(IS[0, ' ' , " " ]);
Console.ReadKey();
}
}
|
3)模拟实现集合
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | class MyCllection
{
ArrayList arrInt = new ArrayList();
ArrayList arrStr = new ArrayList();
ArrayList obj= new ArrayList();
public void Add( string key, object obj)
{
int index = arrStr.Add(key);
arrInt.Add(index);
this .obj.Add(obj);
}
public object this [ int index]
{
get { return obj[index]; }
}
public object this [ string key]
{
get { return obj[arrStr.IndexOf(key)]; }
}
}
static void Main( string [] args)
{
MyCllection mc = new MyCllection();
mc.Add( "HYL" , "韩迎龙" );
mc.Add( "HYL" , "韩全龙" );
Console.WriteLine(mc[0]);
Console.WriteLine(mc[ "HYL" ]);
Console.ReadKey();
}
|
- foreach语法
(1) 执行
1)可以只遍历一部分吗? 不能
2)可以倒着遍历吗? 不能
3)举例说明:
int[] nums = { 1, 4, 6, 87, 87, 3, 23, 45 };
foreach (int item in nums)
{
Console.WriteLine(item);
}
Console.ReadKey();
(2)数据源应该是一个可枚举的类型(IEnumerable)
(3)foreach循环的步骤
1)foreach循环首先到数据集中调用GetEnumerator方法得到枚举器对象
2)到in关键字,调用MoveNext()方法
3)这个方法返回bool值,将枚举器移到数据集的下一个数据上,并检查是否有数据,如果有,返回true,否则返回false
4)到临时变量(迭代变量),开始调用枚举器的Current属性,将当前的数据取出来,然后赋值给临时变量
5)就可以使用了
- 嵌套类
(1) 有时候在某个类型中需要一个特定的类型处理数据,而这个类型只在当前对象类中可使用
(2)可以将这个类定义在一个类的里面,此时称为嵌套类
(3)嵌套类的访问修饰符和一般成员一样
(4)一般是为了考虑安全问题
- yield迭代器
(1) 一般的语法:yield return 数据
(2)foreach在执行开始访问数据集的时候,依旧是调用IEnumerable中的GetEnumerator方法
(3)这个Getenumerator方法可以使用这个迭代器返回数据
(4)在方法中写上循环,循环体上放上yield,那么循环不会立即结束
(5)每当执行到yield的时候就会停在那里,跳到foreach中
(6)foreach执行到in的时候,又会跳到上次停留的yield那里,继续向下执行
(7)直到下一个yield,再次调用foreach
public IEnumerator GetEnumerator()
{
for(int i=0;i<arr.Count;i++)
{
yield return arr[i];
}
}
- Hashtable 字典集合
(1) 举例说明:
Hashtable has = new Hashtable();
has.Add("BigBoss", "韩迎龙");
has.Add("sdd", "的事实");
has.Add("dfd", "的速度");
Console.WriteLine(has["BigBoss"]);
(2)Hashtable的使用,实现一个电子词典
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | class Program
{
static void Main( string [] args)
{
string [] words = File.ReadAllLines( "英汉词典TXT格式.txt" , Encoding.Default);
Hashtable has = new Hashtable();
for ( int i = 0; i < words.Length; i++)
{
string [] temp = words[i].Split( new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (temp.Length == 1)
{
continue ;
}
string key = temp[0];
string value = string .Join( " " , temp, 1, temp.Length - 1);
if (!has.ContainsKey(key))
{
has.Add(key, value);
}
else
{
has[key] = string .Format( "{0}\n{1}" , has[i], value);
}
}
while ( true )
{
Console.Write( "请输入单词?" );
string str=Console.ReadLine();
if (has.ContainsKey(str))
{
Console.WriteLine(has[str]);
}
else
{
Console.WriteLine( "很抱歉,你说查询的词汇没有找到" );
}
}
Console.ReadKey();
}
}
static void Main( string [] args)
{
string [] words = File.ReadAllLines( "英汉词典TXT格式.txt" , Encoding.Default);
Hashtable has = new Hashtable();
for ( int i = 0; i < words.Length; i++)
{
string [] temp = words[i].Split( new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
string key = temp[0];
string value = temp[1];
if (temp.Length != 2)
{
continue ;
}
if (!has.ContainsKey(key))
{
has.Add(key, value);
}
else
{
has[key] = string .Format( "{0}\n{1}" , has[i], value);
}
}
while ( true )
{
Console.Write( "请输入单词?" );
string str=Console.ReadLine();
if (has.ContainsKey(str))
{
Console.WriteLine(has[str]);
}
else
{
Console.WriteLine( "很抱歉,你说查询的词汇没有找到" );
}
}
Console.ReadKey();
}
}
|
(3)如何遍历?
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | static void Main( string [] args)
{
Hashtable has = new Hashtable();
has.Add( "1" , "韩迎龙" );
has.Add( "2" , "得到" );
foreach ( string item in has.Keys)
{
Console.WriteLine(item);
}
foreach ( string item in has.Values)
{
Console.WriteLine(item);
}
foreach (DictionaryEntry item in has)
{
Console.WriteLine( "{0}是{1}" , item.Key, item.Value); ;
}
Console.ReadKey();
}
|
(4)var 类型推断
1)var val=数据;
2)赋什么数据就是什么类型
3)类型确定以后就不能变了
4)必须保证类型赋值时时确定的
5)何时使用类型推断
->匿名类型
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | static void Main( string [] args)
{
var person = new { Name = "张三" , Age = 23, Gender = '男' };
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.WriteLine(person.Gender);
Console.ReadKey();
}
|
->Linq查询
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | static void Main( string [] args)
{
int [] nums = { 132, 454, 667, 343, 65, 76, 74 };
var query = from n in nums
where n > 100 && n < 500
select n;
foreach (var item in query)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
|
前言:漫长的国庆长假终于快结束了,我们该工作的工作了,该学习的学习了,该干什么的也都开始了,这篇博客我主要说一下C#中集合的使用,也就是ArrayList集合和Hashtable字典集合的使用,我在这里说的主要还是简单的使用,使学习的能够很快的学习集合然后自己研究集合的一些高级用法,在最后还列举出了一些常用的小案例。
- ArrayList
(1) 命名空间 System.Collection
(2)创建对象
1)增
->Add
->AddRange 任何一个集合对象
int[] num = { 1, 2, 3, 4, 5, 6 };
ArrayList arr = new ArrayList();
//ICollection一个对象里面包含很多其他对象
arr.AddRange(num);
->Insert
2)删
->Remove
->RemoveAt
->Clear
3)改
->像数组一样通过索引来修改
4)查
->Contains
->IndexOf
- 自定义集合
(1) 集合是Object类型,处理数据的时候会需要强转等操作
(2)举例说明:
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | 1)新建一个Person类
class Person
{
public string Name { get ; set ; }
public int Age { get ; set ; }
public char Gender { get ; set ; }
public Person( string n, int a, char g)
{
Name = n;
Age = a;
Gender = g;
}
public void SayHello()
{
Console.WriteLine( "我叫{0}" , Name);
}
}
2)新建一个PeresonCollection类
class PersonCollection
{
ArrayList arr = new ArrayList();
public void Add(Person p)
{
arr.Add(p);
}
public void AddRange( params Person[] ps)
{
arr.AddRange(ps);
}
public Person this [ int index]
{
get { return (Person)arr[index]; }
}
public int Count
{
get { return arr.Count; }
}
}
3)在main方法中实现
static void Main( string [] args)
{
PersonCollection ps = new PersonCollection();
ps.Add( new Person( "韩迎龙" , 23, '男' ));
ps.Add( new Person( "韩全龙" , 16, '男' ));
ps.Add( new Person( "泛亚内" , 16, '男' ));
ps.Add( new Person( "野田" , 16, '男' ));
for ( int i = 0; i < ps.Count; i++)
{
ps[i].SayHello();
}
Console.ReadKey();
}
|
(3)定义索引
1)就是一个通过传进来的参数访问内部数据的一个属性(带有参数的属性)
2)public 返回类型 this[索引参数类型 参数名]
{
get{return 通过参数访问的数据;}
set{通过参数处理要修改的数据=value}
}
案例说明:
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | class Arr
{
int [] nums = { 10, 23, 34, 45, 56 };
public int this [ int index]
{
get {
if (index > nums.Length - 1)
{
throw new Exception( "索引超出异常" );
}
return nums[index];
}
set { nums[index] = value; }
}
public int Count
{
get { return nums.Length; }
}
}
class IndexString
{
int num = 10;
string str = "字符串韩迎龙" ;
char ch = 'c' ;
public int this [ int index]
{
get { return num; }
}
public string this [ string str]
{
get { return this .str; }
}
public char this [ char c]
{
get { return ch; }
}
public string this [ int n, char c, string s]
{
get { return num + str + ch; }
}
}
class Program
{
static void Main( string [] args)
{
IndexString IS= new IndexString();
Console.WriteLine(IS[ ' ' ]);
Console.WriteLine(IS[0, ' ' , " " ]);
Console.ReadKey();
}
}
|
3)模拟实现集合
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | class MyCllection
{
ArrayList arrInt = new ArrayList();
ArrayList arrStr = new ArrayList();
ArrayList obj= new ArrayList();
public void Add( string key, object obj)
{
int index = arrStr.Add(key);
arrInt.Add(index);
this .obj.Add(obj);
}
public object this [ int index]
{
get { return obj[index]; }
}
public object this [ string key]
{
get { return obj[arrStr.IndexOf(key)]; }
}
}
static void Main( string [] args)
{
MyCllection mc = new MyCllection();
mc.Add( "HYL" , "韩迎龙" );
mc.Add( "HYL" , "韩全龙" );
Console.WriteLine(mc[0]);
Console.WriteLine(mc[ "HYL" ]);
Console.ReadKey();
}
|
- foreach语法
(1) 执行
1)可以只遍历一部分吗? 不能
2)可以倒着遍历吗? 不能
3)举例说明:
int[] nums = { 1, 4, 6, 87, 87, 3, 23, 45 };
foreach (int item in nums)
{
Console.WriteLine(item);
}
Console.ReadKey();
(2)数据源应该是一个可枚举的类型(IEnumerable)
(3)foreach循环的步骤
1)foreach循环首先到数据集中调用GetEnumerator方法得到枚举器对象
2)到in关键字,调用MoveNext()方法
3)这个方法返回bool值,将枚举器移到数据集的下一个数据上,并检查是否有数据,如果有,返回true,否则返回false
4)到临时变量(迭代变量),开始调用枚举器的Current属性,将当前的数据取出来,然后赋值给临时变量
5)就可以使用了
- 嵌套类
(1) 有时候在某个类型中需要一个特定的类型处理数据,而这个类型只在当前对象类中可使用
(2)可以将这个类定义在一个类的里面,此时称为嵌套类
(3)嵌套类的访问修饰符和一般成员一样
(4)一般是为了考虑安全问题
- yield迭代器
(1) 一般的语法:yield return 数据
(2)foreach在执行开始访问数据集的时候,依旧是调用IEnumerable中的GetEnumerator方法
(3)这个Getenumerator方法可以使用这个迭代器返回数据
(4)在方法中写上循环,循环体上放上yield,那么循环不会立即结束
(5)每当执行到yield的时候就会停在那里,跳到foreach中
(6)foreach执行到in的时候,又会跳到上次停留的yield那里,继续向下执行
(7)直到下一个yield,再次调用foreach
public IEnumerator GetEnumerator()
{
for(int i=0;i<arr.Count;i++)
{
yield return arr[i];
}
}
- Hashtable 字典集合
(1) 举例说明:
Hashtable has = new Hashtable();
has.Add("BigBoss", "韩迎龙");
has.Add("sdd", "的事实");
has.Add("dfd", "的速度");
Console.WriteLine(has["BigBoss"]);
(2)Hashtable的使用,实现一个电子词典
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | class Program
{
static void Main( string [] args)
{
string [] words = File.ReadAllLines( "英汉词典TXT格式.txt" , Encoding.Default);
Hashtable has = new Hashtable();
for ( int i = 0; i < words.Length; i++)
{
string [] temp = words[i].Split( new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (temp.Length == 1)
{
continue ;
}
string key = temp[0];
string value = string .Join( " " , temp, 1, temp.Length - 1);
if (!has.ContainsKey(key))
{
has.Add(key, value);
}
else
{
has[key] = string .Format( "{0}\n{1}" , has[i], value);
}
}
while ( true )
{
Console.Write( "请输入单词?" );
string str=Console.ReadLine();
if (has.ContainsKey(str))
{
Console.WriteLine(has[str]);
}
else
{
Console.WriteLine( "很抱歉,你说查询的词汇没有找到" );
}
}
Console.ReadKey();
}
}
static void Main( string [] args)
{
string [] words = File.ReadAllLines( "英汉词典TXT格式.txt" , Encoding.Default);
Hashtable has = new Hashtable();
for ( int i = 0; i < words.Length; i++)
{
string [] temp = words[i].Split( new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
string key = temp[0];
string value = temp[1];
if (temp.Length != 2)
{
continue ;
}
if (!has.ContainsKey(key))
{
has.Add(key, value);
}
else
{
has[key] = string .Format( "{0}\n{1}" , has[i], value);
}
}
while ( true )
{
Console.Write( "请输入单词?" );
string str=Console.ReadLine();
if (has.ContainsKey(str))
{
Console.WriteLine(has[str]);
}
else
{
Console.WriteLine( "很抱歉,你说查询的词汇没有找到" );
}
}
Console.ReadKey();
}
}
|
(3)如何遍历?
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | static void Main( string [] args)
{
Hashtable has = new Hashtable();
has.Add( "1" , "韩迎龙" );
has.Add( "2" , "得到" );
foreach ( string item in has.Keys)
{
Console.WriteLine(item);
}
foreach ( string item in has.Values)
{
Console.WriteLine(item);
}
foreach (DictionaryEntry item in has)
{
Console.WriteLine( "{0}是{1}" , item.Key, item.Value); ;
}
Console.ReadKey();
}
|
(4)var 类型推断
1)var val=数据;
2)赋什么数据就是什么类型
3)类型确定以后就不能变了
4)必须保证类型赋值时时确定的
5)何时使用类型推断
->匿名类型
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | static void Main( string [] args)
{
var person = new { Name = "张三" , Age = 23, Gender = '男' };
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.WriteLine(person.Gender);
Console.ReadKey();
}
|
->Linq查询
View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | static void Main( string [] args)
{
int [] nums = { 132, 454, 667, 343, 65, 76, 74 };
var query = from n in nums
where n > 100 && n < 500
select n;
foreach (var item in query)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
|