,转载c#集合 C#中的集合学习笔记

  前言:漫长的国庆长假终于快结束了,我们该工作的工作了,该学习的学习了,该干什么的也都开始了,这篇博客我主要说一下C#中集合的使用,也就是ArrayList集合和Hashtable字典集合的使用,我在这里说的主要还是简单的使用,使学习的能够很快的学习集合然后自己研究集合的一些高级用法,在最后还列举出了一些常用的小案例。

  1. 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. 自定义集合

(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类

classPerson

{

publicstringName {get;set; }

publicintAge {get;set; }

publiccharGender {get;set; }

publicPerson(stringn,inta,charg)

{

Name = n;

Age = a;

Gender = g;

}

publicvoidSayHello()

{

Console.WriteLine("我叫{0}", Name);

}

}

2)新建一个PeresonCollection类

classPersonCollection

{

ArrayList arr =newArrayList();

publicvoidAdd(Person p)

{

arr.Add(p);

}

publicvoidAddRange(paramsPerson[] ps)

{

arr.AddRange(ps);

}

publicPersonthis[intindex]

{

get{return(Person)arr[index]; }

}

publicintCount

{

get{returnarr.Count; }

}

}

3)在main方法中实现

staticvoidMain(string[] args)

{

PersonCollection ps =newPersonCollection();

ps.Add(newPerson("韩迎龙", 23,'男'));

ps.Add(newPerson("韩全龙", 16,'男'));

ps.Add(newPerson("泛亚内", 16,'男'));

ps.Add(newPerson("野田", 16,'男'));

for(inti = 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

classArr

{

int[] nums = { 10, 23, 34, 45, 56 };

publicintthis[intindex]

{

get{

if(index > nums.Length - 1)

{

thrownewException("索引超出异常");

}

returnnums[index];

}

set{ nums[index] = value; }

}

publicintCount

{

get{returnnums.Length; }

}

}

classIndexString

{

intnum = 10;

stringstr ="字符串韩迎龙";

charch ='c';

publicintthis[intindex]

{

get{returnnum; }

}

publicstringthis[stringstr]

{

get{returnthis.str; }

}

publiccharthis[charc]

{

get{returnch; }

}

publicstringthis[intn,charc,strings]

{

get{returnnum + str + ch; }

}

}

classProgram

{

staticvoidMain(string[] args)

{

IndexString IS=newIndexString();

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

classMyCllection

{

ArrayList arrInt =newArrayList();

ArrayList arrStr =newArrayList();

ArrayList obj=newArrayList();

publicvoidAdd(stringkey,objectobj)

{

intindex = arrStr.Add(key);

arrInt.Add(index);

this.obj.Add(obj);

}

publicobjectthis[intindex]

{

get{returnobj[index]; }

}

publicobjectthis[stringkey]

{

get{returnobj[arrStr.IndexOf(key)]; }

}

}

staticvoidMain(string[] args)

{

MyCllection mc =newMyCllection();

mc.Add("HYL","韩迎龙");

mc.Add("HYL","韩全龙");

Console.WriteLine(mc[0]);

Console.WriteLine(mc["HYL"]);

Console.ReadKey();

}

  1. 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. 嵌套类

(1) 有时候在某个类型中需要一个特定的类型处理数据,而这个类型只在当前对象类中可使用

(2)可以将这个类定义在一个类的里面,此时称为嵌套类

(3)嵌套类的访问修饰符和一般成员一样

(4)一般是为了考虑安全问题

  1. 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];

}

}

  1. 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

classProgram

{

staticvoidMain(string[] args)

{

string[] words = File.ReadAllLines("英汉词典TXT格式.txt", Encoding.Default);

Hashtable has =newHashtable();

for(inti = 0; i < words.Length; i++)

{

string[] temp = words[i].Split(newchar[] {' '}, StringSplitOptions.RemoveEmptyEntries);

if(temp.Length == 1)

{

continue;

}

stringkey = temp[0];

stringvalue =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("请输入单词?");

stringstr=Console.ReadLine();

if(has.ContainsKey(str))

{

Console.WriteLine(has[str]);

}

else

{

Console.WriteLine("很抱歉,你说查询的词汇没有找到");

}

}

Console.ReadKey();

}

}

staticvoidMain(string[] args)

{

string[] words = File.ReadAllLines("英汉词典TXT格式.txt", Encoding.Default);

Hashtable has =newHashtable();

for(inti = 0; i < words.Length; i++)

{

string[] temp = words[i].Split(newchar[] {' '}, StringSplitOptions.RemoveEmptyEntries);

stringkey = temp[0];

stringvalue = 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("请输入单词?");

stringstr=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

staticvoidMain(string[] args)

{

Hashtable has =newHashtable();

has.Add("1","韩迎龙");

has.Add("2","得到");

//仅仅遍历key

foreach(stringiteminhas.Keys)

{

Console.WriteLine(item);

}

//遍历value

foreach(stringiteminhas.Values)

{

Console.WriteLine(item);

}

//遍历整个集合

foreach(DictionaryEntry iteminhas)

{

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

staticvoidMain(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

staticvoidMain(string[] args)

{

int[] nums = { 132, 454, 667, 343, 65, 76, 74 };

var query = from ninnums

where n > 100 && n < 500

select n;

foreach(var iteminquery)

{

Console.WriteLine(item);

}

Console.ReadKey();

}

  前言:漫长的国庆长假终于快结束了,我们该工作的工作了,该学习的学习了,该干什么的也都开始了,这篇博客我主要说一下C#中集合的使用,也就是ArrayList集合和Hashtable字典集合的使用,我在这里说的主要还是简单的使用,使学习的能够很快的学习集合然后自己研究集合的一些高级用法,在最后还列举出了一些常用的小案例。

  1. 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. 自定义集合

(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类

classPerson

{

publicstringName {get;set; }

publicintAge {get;set; }

publiccharGender {get;set; }

publicPerson(stringn,inta,charg)

{

Name = n;

Age = a;

Gender = g;

}

publicvoidSayHello()

{

Console.WriteLine("我叫{0}", Name);

}

}

2)新建一个PeresonCollection类

classPersonCollection

{

ArrayList arr =newArrayList();

publicvoidAdd(Person p)

{

arr.Add(p);

}

publicvoidAddRange(paramsPerson[] ps)

{

arr.AddRange(ps);

}

publicPersonthis[intindex]

{

get{return(Person)arr[index]; }

}

publicintCount

{

get{returnarr.Count; }

}

}

3)在main方法中实现

staticvoidMain(string[] args)

{

PersonCollection ps =newPersonCollection();

ps.Add(newPerson("韩迎龙", 23,'男'));

ps.Add(newPerson("韩全龙", 16,'男'));

ps.Add(newPerson("泛亚内", 16,'男'));

ps.Add(newPerson("野田", 16,'男'));

for(inti = 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

classArr

{

int[] nums = { 10, 23, 34, 45, 56 };

publicintthis[intindex]

{

get{

if(index > nums.Length - 1)

{

thrownewException("索引超出异常");

}

returnnums[index];

}

set{ nums[index] = value; }

}

publicintCount

{

get{returnnums.Length; }

}

}

classIndexString

{

intnum = 10;

stringstr ="字符串韩迎龙";

charch ='c';

publicintthis[intindex]

{

get{returnnum; }

}

publicstringthis[stringstr]

{

get{returnthis.str; }

}

publiccharthis[charc]

{

get{returnch; }

}

publicstringthis[intn,charc,strings]

{

get{returnnum + str + ch; }

}

}

classProgram

{

staticvoidMain(string[] args)

{

IndexString IS=newIndexString();

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

classMyCllection

{

ArrayList arrInt =newArrayList();

ArrayList arrStr =newArrayList();

ArrayList obj=newArrayList();

publicvoidAdd(stringkey,objectobj)

{

intindex = arrStr.Add(key);

arrInt.Add(index);

this.obj.Add(obj);

}

publicobjectthis[intindex]

{

get{returnobj[index]; }

}

publicobjectthis[stringkey]

{

get{returnobj[arrStr.IndexOf(key)]; }

}

}

staticvoidMain(string[] args)

{

MyCllection mc =newMyCllection();

mc.Add("HYL","韩迎龙");

mc.Add("HYL","韩全龙");

Console.WriteLine(mc[0]);

Console.WriteLine(mc["HYL"]);

Console.ReadKey();

}

  1. 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. 嵌套类

(1) 有时候在某个类型中需要一个特定的类型处理数据,而这个类型只在当前对象类中可使用

(2)可以将这个类定义在一个类的里面,此时称为嵌套类

(3)嵌套类的访问修饰符和一般成员一样

(4)一般是为了考虑安全问题

  1. 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];

}

}

  1. 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

classProgram

{

staticvoidMain(string[] args)

{

string[] words = File.ReadAllLines("英汉词典TXT格式.txt", Encoding.Default);

Hashtable has =newHashtable();

for(inti = 0; i < words.Length; i++)

{

string[] temp = words[i].Split(newchar[] {' '}, StringSplitOptions.RemoveEmptyEntries);

if(temp.Length == 1)

{

continue;

}

stringkey = temp[0];

stringvalue =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("请输入单词?");

stringstr=Console.ReadLine();

if(has.ContainsKey(str))

{

Console.WriteLine(has[str]);

}

else

{

Console.WriteLine("很抱歉,你说查询的词汇没有找到");

}

}

Console.ReadKey();

}

}

staticvoidMain(string[] args)

{

string[] words = File.ReadAllLines("英汉词典TXT格式.txt", Encoding.Default);

Hashtable has =newHashtable();

for(inti = 0; i < words.Length; i++)

{

string[] temp = words[i].Split(newchar[] {' '}, StringSplitOptions.RemoveEmptyEntries);

stringkey = temp[0];

stringvalue = 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("请输入单词?");

stringstr=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

staticvoidMain(string[] args)

{

Hashtable has =newHashtable();

has.Add("1","韩迎龙");

has.Add("2","得到");

//仅仅遍历key

foreach(stringiteminhas.Keys)

{

Console.WriteLine(item);

}

//遍历value

foreach(stringiteminhas.Values)

{

Console.WriteLine(item);

}

//遍历整个集合

foreach(DictionaryEntry iteminhas)

{

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

staticvoidMain(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

staticvoidMain(string[] args)

{

int[] nums = { 132, 454, 667, 343, 65, 76, 74 };

var query = from ninnums

where n > 100 && n < 500

select n;

foreach(var iteminquery)

{

Console.WriteLine(item);

}

Console.ReadKey();

}