C#中的集合学习笔记
前言:漫长的国庆长假终于快结束了,我们该工作的工作了,该学习的学习了,该干什么的也都开始了,这篇博客我主要说一下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)举例说明:
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}
}
案例说明:
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)模拟实现集合
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的使用,实现一个电子词典
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)如何遍历?
static void Main(string[] args){Hashtable has = new Hashtable();has.Add("1", "韩迎龙");has.Add("2", "得到");//仅仅遍历keyforeach (string item in has.Keys){Console.WriteLine(item);}//遍历valueforeach (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)何时使用类型推断
->匿名类型
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查询
static void Main(string[] args){int[] nums = { 132, 454, 667, 343, 65, 76, 74 };var query = from n in numswhere n > 100 && n < 500select n;foreach (var item in query){Console.WriteLine(item);}Console.ReadKey();}
C#中的集合学习笔记相关推荐
- Java 集合学习笔记:Collection
Java 集合学习笔记:Collection UML 简介 方法和说明 JDK8 新增 `default` 方法 AbstractCollection isEmpty contains(Object ...
- Python中索引的学习笔记
1 前言 今天在学习FaceBoxes- 看到一个比较奇怪的代码,"order = scores.argsort()[::-1][:args.top_k]",不太懂这个" ...
- 机器人学中的状态估计——学习笔记
机器人学中的状态估计--学习笔记 离散时间的批量估计问题 1.最大后验概率法(Maximum A Posteriori, MAP) 2.贝叶斯推断(Bayesian inference) 离散时间的迭 ...
- 机器人学中的状态估计学习笔记(二)第三章线性高斯系统的状态估计
机器人学中的状态估计学习笔记(二)第三章线性高斯系统的状态估计 3.1 离散时间的批量估计问题 3.1.1 问题定义 3.1.2 最大后验估计 3.1.3 贝叶斯推断 3.1.4 存在性.唯一性与能观 ...
- JavaSE中Map框架学习笔记
前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...
- 我的Android进阶之旅------gt;Android中编解码学习笔记
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...
- Java中expecial,RxJava 学习笔记 (一)
作者: 一字马胡 转载标志 [2017-12-13] 更新日志 日期 更新内容 备注 2017-12-13 RxJava学习笔记系列 系列笔记 (一) 2017-12-15 增加系列笔记(二) 201 ...
- zynq中interrupts的学习笔记(一)
本学习笔记参考UG585-Zynq-7000-TRM.pdf ch.7:Interrupts.文中有说的不够严谨或者是有错误的地方,欢迎指正! zynq中的interrupts有很多种,大体上分为三类 ...
- Oracle中job_type,【学习笔记】Oracle DBMS_SCHEDULER详细介绍与使用案例
天萃荷净 分享一篇关于Oracle DBMS_SCHEDULER详细介绍与使用案例 1.通过DBMS_SCHEDULER.CREATE_JOB直接创建job SQL> create table ...
最新文章
- 2_2 递归与分治策略(分治法的基本思想)
- [转]Git远程操作详解
- java linux so
- 【HDU - 5916】Harmonic Value Description (构造,思维,SJ题)
- 11.微服务设计 --- 规模化微服务
- Oracle 同音字查询,对外汉语汉字教学
- python报错:Empty suite
- 《微积分》的本质笔记
- 阿里首席风险官郑俊芳:安全是我们的生命线,将时刻保持敬畏心
- 简单创意思维导图绘制教程分享
- Python调用百度AI识别身份证
- Ubuntu/Linux Server 服务器系统安装
- 链表 - 头节点的意义
- 自定义模型 架构_品牌架构定义和模型的艺术,可帮助您摆脱混乱
- 基于springboot的作业管理系统
- 英语四六级作文最全笔记
- 现在的年轻人怎么了?
- UE4第一人称游戏 ——(3)添加准星
- WINVNC源码阅读(五)
- ORACLE学习笔记-CentOS 7.5 Oracle 11gR2安装部署
热门文章
- 【自用】 VS2017 部分快捷键
- Tensorflow学习笔记:多项式拟合
- 趴在门口的云计算,盯上了屋内狂奔的CDN
- 2015北京区域赛 Mysterious Antiques in Sackler Museum 几何基础+思维
- 委托到Lambda的进化: ()= {} 这个lambda表达式就是一个无参数的委托及具体方法的组合体。...
- TFS中的迭代(五)
- POJ-2728 Desert King 最优比例生成树 01分数规划/参数搜索
- [LeetCode] Multiply Strings 解题报告
- matlab根据转移函数绘制放大器幅频响应和相频响应
- Attribute ‘sklearn.linear_model._logistic.LogisticRegression.multi_class‘ must be explicitly set to