C#基础03
学习集合的一些知识。集合:泛型集合,非泛型集合;ArrayList,Hashtable,List<T>,Dictionary<k,v>等,还有一些集合的常用方法。
一:集合的介绍
1:集合的特点
泛型集合 using System.Collections.Generic
非泛型集合 using System.Collections
*:对于数组而言,长度是一定的,可能造成内存的浪费,但是集合可以解决这个问题,它的长度是动态变化的。
*:可以解除数组对数据类型的限制。集合里面的类型可以是不同的。其实集合里面保存的数据也是保存在数组里面,只是集合对数组进行了封装。
*集合获取个数的时候用Count而数组用Length。
2:集合的分类
下面是常用的集合
Hashtable aa = new Hashtable();
Dictionary<int, int> aaa = new Dictionary<int, int>();
ArrayList arr = new ArrayList();
* 键值对集合(“哈希表”) 集合里面有key和Value来存储值。每个key对应一个唯一的Value。
{Hashtable,Dictionary<k,v>}
* ArrayList集合
ArrayList arrayList = new ArrayList();
arrayList.Add(10);
//传递object类型
arrayList.Add("10");
//这里可以传递所有的集合类型,数组类型。
arrayList.AddRange(arrayList);
arrayList.AddRange(new int[]{1,4,5,5,5,5,5,});
//通过下标来遍历元素
//插入元素
arrayList.Insert(0,"ahui");
//删除元素 <删除第7个元素>
arrayList.RemoveAt(7); Console.WriteLine("{0}",arrayList.Capacity);
Console.ReadKey();
3:集合删除元素的时候不能使用遍历删除,因为每一次集合的总量都会减少。直接调用Clear()来删除元素。
4:集合常用操作,添加,遍历,移除
属性
Capacity(集合中可以容纳的个数,翻倍增长)
Count(集合中实际存放的个数)
Contains()包含某个元素
ToArray()集合转换为数组
5:对于集合,别的类型装入之后,全部都会成为object类型保存。
6:对于集合可以调用Sort()进行排序,默认的情况是按升序进行的,我们可以实现它里面的IComparer接口,按照我们想排序的对象进行排序。因为调用Sort方法的时候它会找实现IComparer接口的类来进行排序。
*在IComparer接口中我们要实现它的CompareTo方法,在这里面进行比较。
class Person:IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public string Adress { get; set; }
/// <summary>
/// 实现IComparable接口,比较排序
/// </summary>
public int CompareTo(object obj)
{
var p = obj as Person; //将object类型强转为Person类型
if(p!=null)
{
return p.Age-this.Age;
}
return 0;
}
}
7:Hashtable集合
*:这个集合和ArrayList不一样,它里面保存的格式是key,value形式的。(键和值),特点:key不能重复,是唯一的。只能通过键来获取值。
var hash=new Hashtable();
hash.Add("1","ahui");
hash.Add("2",new Indo(){Name="张辉"});
var dd = hash["2"] as Indo;
Console.WriteLine(dd.Name);
Console.ReadKey();
*:Hashtable集合的遍历
由于此集合没有Count属性,不能使用for循环来进行遍历,此时我们可以使用Foreach来进行。<因为它实现了IEnumerable接口>
*:可以通过三种方法来找到值
//遍历键
foreach (var item in hash.Keys)
{
Console.WriteLine("键{0}--值{1}",item,hash[item]);
}
//遍历值
foreach (var key in hash.Values)
{
Console.WriteLine(key);
}
//直接遍历键值对
foreach (DictionaryEntry kv in hash)
{
Console.WriteLine("键{0},值{1}",kv.Key,kv.Value);
}
Console.ReadKey();
8:List<>集合
在实际的操作中我们很少用之前的两种集合[ArrayList和Hashtable],使用泛型集合[List<>和Dictionary<K,V>],作用是之前的集合可以加各种类型,使用起来不是很方便,此时就有了这种泛型集合,只能保存特定的类型。而且扩展了很多的方法。
9:字符串生成器StringBuilder 一个可变的字符序列
Var sb=new StringBuilder();
这个字符串生成器的好处就是字符串的长度是可变的,随着存储的长度的变化而变化。通过Append()来追加字符串填充到sb中..在你初始化一个StringBuilder 之后,它会自动申请一个默认的StringBuilder容量(默认值是16),这个容量是由Capacity来控制的.并且允许,我们根据需要来控制Capacity的大小,也可以通过Length来获取或设置StringBuilder 的长度;
Eg: StringBuilder可变字符串
var sb = new System.Text.StringBuilder();
sb.Append("123456789"); //添加一个字符串
sb.Length = 30; //设置容量为3
Console.WriteLine(sb.ToString()); //这里输出:123
sb.Length = 30;//重新设置容量为30
Console.WriteLine(sb.ToString() + ",结尾");//这里在原来字符串后面补齐空格,至到Length的为30
Console.WriteLine(sb.Length);//这里输出的长度为30
StringBuilder sb = new StringBuilder();
sb.Append(1);
sb.Append(1);
Console.WriteLine(sb.Capacity);
Console.WriteLine(sb.Length);
10:StringBuilder<>集合
Var str=new StringBuilder<char,char>;
这个集合的类型必须指定,其里面的键的值不能相同。可以通过键找到相应的值,里面保存的是二维数组的形式。
二:练习题
eg1: 计算字符串中字母出现的次数,不区分大小写.
string msg = "Welcome ,to China! world ! dsjfdsl.jfdsf";
msg = msg.ToLower();
Dictionary<char, int> dict = new Dictionary<char, int>(); //声明一个kv集合,k保存里面具体的值,v保存出现的次数。
for (int i = 0; i < msg.Length; i++)
{
if (char.IsLetter(msg[i])) //去掉除字母之外的东西
{
if (dict.ContainsKey(msg[i])) //dict里面有这个东西
{
dict[msg[i]]++; //表示把msg键加入,里面的值也加1
}
else
{
dict[msg[i]] = 1;
}
} }
//输出 注意类型为KeyValuePair
foreach (KeyValuePair<char, int> kv in dict)
{
Console.WriteLine("{0}{1}", kv.Key, kv.Value);
}
Console.ReadKey();
eg2:将123转为大写.
string str = "1q 2w 3e 4r 5t 6y 7u 8i 9o";
var dict = new Dictionary<char, char>();
string[] parts = str.Split(' '); //Spilt把一个字符串以什么方式分割成字符串数组
for (int i = 0; i < parts.Length; i++)
{
dict.Add(parts[i][0], parts[i][1]); //这里的存储是二维数组
}
Console.WriteLine("请输入一个数:??");
string number = Console.ReadLine();
StringBuilder sb = new StringBuilder(); //一个可变的字符序列
for (int i = 0; i < number.Length; i++)
{
sb.Append(dict[number[i]]);
}
Console.WriteLine(sb.ToString());
Console.ReadKey();
eg3 : 将int数组中的奇数放到一个新的int数组中返回
int[] arry = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> arr = new List<int>();
for (int i = 0; i < arry.Length; i++)
{
if (arry[i] % 2 != 0)
{
arr.Add(arry[i]);
}
}
int[] aa = arr.ToArray();
for (int i = 0; i < aa.Length; i++)
{
Console.WriteLine(aa[i]);
}
Console.ReadKey();
eg4:随机产生10个数字,偶数,不重复
ArrayList arr = new ArrayList();
Random random = new Random(); //声明随机数
var n = random.NextDouble();
Console.WriteLine(n);
while (arr.Count < 10) //集合里面的数不能超过10
{
var num = random.Next(1, 101);
if (num % 2 == 0 && !arr.Contains(num)) //偶数,不重复
{
arr.Add(num);
}
}
Console.WriteLine("总数为{0}", arr.Capacity);
foreach (var item in arr)
{
Console.WriteLine(item);
}
Console.ReadKey();
eg5:插入删除重复
ArrayList arr1 = new ArrayList() { "a", "b", "c", "d", "e" };
ArrayList arr2 = new ArrayList() { "d", "e", "f", "g", "h" }; var arr3 = new ArrayList(new string[] { "11", "222", "1", "2" }); //arr1.InsertRange(0,arr2); foreach (var item in arr1)
{
Console.WriteLine(item);
}
Console.WriteLine("**************"); for (int i = 0; i < arr2.Count; i++)
{
if (!arr1.Contains(arr2[i]))
{
arr1.Add(arr2[i]);
}
}
Console.WriteLine(arr1.Count); foreach (var item in arr1)
{
Console.WriteLine(item);
}
Console.ReadKey();
eg6:随机产生10个数字,偶数,不重复
ArrayList arr = new ArrayList();
Random random = new Random(); //声明随机数
var n = random.NextDouble();
Console.WriteLine(n);
while (arr.Count < 10) //集合里面的数不能超过10
{
var num = random.Next(1, 101);
if (num % 2 == 0 && !arr.Contains(num)) //偶数,不重复
{
arr.Add(num);
}
}
Console.WriteLine("总数为{0}", arr.Capacity);
foreach (var item in arr)
{
Console.WriteLine(item);
}
Console.ReadKey();
eg7 :List<>集合与Dictionary集合,修改上面的集,偶数使用List<>集合来实现
List<int> Even = new List<int>();
List<int> Oven = new List<int>();
string sb = "1 2 3 4 5 6 7 8 9";
string[] num = sb.Split(' ');
for (int i = 0; i < num.Length; i++)
{
if ((int.Parse(num[i]) % 2 == 0))
{
Oven.Add(int.Parse(num[i]));
}
else
{
Even.Add(int.Parse(num[i]));
}
}
Even.AddRange(Oven);
foreach (var item in Even)
{
Console.WriteLine(item);
}
Console.ReadKey();
C#基础03的更多相关文章
- javaSE基础03
javaSE基础03 生活中常见的进制:十进制(0-9).星期(七进制(0-6)).时间(十二进制(0-11)).二十四进制(0-23) 进制之间的转换: 十进制转为二进制: 将十进制除以2,直到商为 ...
- javascript基础03
javascript基础03 1. 算术运算符 后增量/后减量运算符 ++ ,-- 比较运算符 ( >, <, >=, <=, ==, !=,===,!== ) 逻辑运算符( ...
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
- day33-线程基础03
线程基础03 6.用户线程和守护线程 用户线程:也叫工作线程,当线程的任务执行完或者通知方法结束.平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程 守护线程(Daem ...
- ADO.NET基础03
数据库和VS的连接,实现数据的同步,让用户的一切信息都可以在数据库中留下记录. ADO.NET基础 它是连接所有数据库的一种特殊的技术,提供对不同的数据库统一操作接口. 在VS中也可以添加数 ...
- php基础03:数据类型
<?php // day01:数据类型 //01.字符串 $x = "hello world"; echo $x; echo "<br>"; ...
- MYSQL基础03(日期函数)
工作中对日期的处理是经常遇到的,需求可能多种多样,因此重点介绍. 1.获取当前日期 select NOW() -- 结果:2015-10-28 22:41:11 ),NOW() -- 结果 2015- ...
- CSS基础(03)
1.简单了解浏览器是如何渲染页面和加载页面 浏览器就是通过HTTP 协议与服务器进行通信,取到数据之后进行渲染的过程,如图: 这图是园友的看着挺符合我思路就直接拿来用了,从 ...
- PHP语言基础03 By ACReaper
03.01逻辑运算符 &&,and ||,or xor 这里只强调一点用and或者or的话,记得加上括号,不然可能出错,至于原因我也不是很清楚,反正尽量直接用&&,|| ...
- [UnityShader基础]03.透明度混合
如果要渲染半透明物体,那么就需要用到透明度混合. 需要注意的有这几点: 1.设置标签:Tags { "Queue"="Transparent" "Ig ...
随机推荐
- java 多线程(daemon)
package com.example; public class App { public static void main(String[] args) { DoDaemon d1 = new D ...
- AMD加载器实现笔记(二)
AMD加载器实现笔记(一)中,我们实现了一个简易的模块加载器.但到目前为止这个加载器还并不能称为AMD加载器,原因很简单,我们还不支持AMD规范中的config配置.这篇文章中我们来添加对config ...
- Wix 安装部署教程(七) 获取管理员权限
应用程序运行的时候,难免会读写文件,产生新的数据.但Program Files下的文件是不能随便更改,Win7下如果没有权限,将会被拒绝.我现在有两种方式,一种是将数据路径移到Program Data ...
- JavaScript思维导图—字符串函数
JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/
- 据说每个大牛、小牛都应该有自己的库——DOM处理续
在上篇据说每个大牛.小牛都应该有自己的库——DOM处理最后剩下attr()和css()方法没有处理,因为这两个方法当时并不自计划中,是写着写着突然想到的,一时间没有特别好的思路,当时已十一点多了,就去 ...
- ejs模板中的四种表达式输出形式
在ejs模板中,通常会用下面四种方式在HTML中输出服务端的变量或表达式的值: 1. 直接在<%%>中写表达式或变量.这种情况通常只是用来进行表达式计算或给变量赋值,不会有任何输出,被称作 ...
- Redis集群~StackExchange.redis连接Sentinel服务器并订阅相关事件(原创)
回到目录 对于redis-sentinel我在之前的文章中已经说过,它是一个仲裁者,当主master挂了后,它将在所有slave服务器中进行选举,选举的原则当然可以看它的官方文章,这与我们使用者没有什 ...
- 大叔最新课程~EF核心技术剖析
EF核心技术剖析介绍 数据上下文(共享对象与实例对象的选择) 自动初始化(Initializer初始化的几种方式) 数据迁移(Migrations如何使用及其重要作用) 实体关系映射(一对一,一对多, ...
- 使用finfo_file()函数检测上传图片的类型
该函数可以检测文件的MIME类型.因为有时候我们只根据文件后缀来判断是不准确的. function getMIME($filename){ $finfo = finfo_open(FILEINFO_M ...
- 锋利的JQuery —— 事件和动画
大图猛戳