学习集合的一些知识。集合:泛型集合,非泛型集合;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的更多相关文章

  1. javaSE基础03

    javaSE基础03 生活中常见的进制:十进制(0-9).星期(七进制(0-6)).时间(十二进制(0-11)).二十四进制(0-23) 进制之间的转换: 十进制转为二进制: 将十进制除以2,直到商为 ...

  2. javascript基础03

    javascript基础03 1. 算术运算符 后增量/后减量运算符 ++ ,-- 比较运算符 ( >, <, >=, <=, ==, !=,===,!== ) 逻辑运算符( ...

  3. 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结

    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...

  4. day33-线程基础03

    线程基础03 6.用户线程和守护线程 用户线程:也叫工作线程,当线程的任务执行完或者通知方法结束.平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程 守护线程(Daem ...

  5. ADO.NET基础03

    数据库和VS的连接,实现数据的同步,让用户的一切信息都可以在数据库中留下记录. ADO.NET基础      它是连接所有数据库的一种特殊的技术,提供对不同的数据库统一操作接口. 在VS中也可以添加数 ...

  6. php基础03:数据类型

    <?php // day01:数据类型 //01.字符串 $x = "hello world"; echo $x; echo "<br>"; ...

  7. MYSQL基础03(日期函数)

    工作中对日期的处理是经常遇到的,需求可能多种多样,因此重点介绍. 1.获取当前日期 select NOW() -- 结果:2015-10-28 22:41:11 ),NOW() -- 结果 2015- ...

  8. CSS基础(03)

    1.简单了解浏览器是如何渲染页面和加载页面            浏览器就是通过HTTP 协议与服务器进行通信,取到数据之后进行渲染的过程,如图:    这图是园友的看着挺符合我思路就直接拿来用了,从 ...

  9. PHP语言基础03 By ACReaper

    03.01逻辑运算符 &&,and ||,or xor 这里只强调一点用and或者or的话,记得加上括号,不然可能出错,至于原因我也不是很清楚,反正尽量直接用&&,|| ...

  10. [UnityShader基础]03.透明度混合

    如果要渲染半透明物体,那么就需要用到透明度混合. 需要注意的有这几点: 1.设置标签:Tags { "Queue"="Transparent" "Ig ...

随机推荐

  1. [Asp.net 开发系列之SignalR篇]专题一:Asp.net SignalR快速入门

    一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到SignalR技术,所以打算总结下Asp.net ...

  2. 冲刺阶段 day11

    项目进展:系部,专业,班级管理这三项没有学生,教师管理部分输入项目多,所以窗体搭建比较简单,代码也简单一些,进行的还算顺利,有了之前的编写经验,很多代码可以直接copy过来,越进行编写越顺利了,已经进 ...

  3. Aspectj 实现Method条件运行

    最近我花了半个小时实现了一个Method的按自定义条件运行的plugin,Condition-Run.实现场景是由于我所工作的客户经常会是在同一个代码集上实现多个Brand,所以有些功能只会限制是几个 ...

  4. [.net 面向对象编程基础] (15) 抽象类

    [.net 面向对象编程基础] (15) 抽象类 前面我们已经使用到了虚方法(使用 Virtual修饰符)和抽象类及抽象方法(使用abstract修饰符)我们在多态一节中说到要实现类成员的重写必须定义 ...

  5. 学习Scala02 基本类型

    scala中有9大基本类型: Byte .Short .Int .Long. Char .String .Float. Double .Boolean 与java的基本类型看起来基本是一致的,但实际上 ...

  6. 【转】优化Web程序的最佳实践

    自动排版有点乱,看着蛋疼,建议下载中文PDF版阅读或阅读英文原文. Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了 一系列的实验.开发了各 ...

  7. Java基础之泛型

    泛型: (1)为什么会出现泛型? 因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患, 如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题. JDK1.5后出 ...

  8. 第2讲 Redis常用命令与高级应用

    目录 一.redis数据类型 5. sorted sets类型和操作 二.Redis常用命令 1.键值相关命令 2.服务器相关命令 三. redis高级应用 1. 给redis服务器设置密码 2.持久 ...

  9. Atitti css transition Animation differ区别

    Atitti  css   transition Animation differ区别 1.1. transition的优点在于简单易用,但是它有几个很大的局限.  1 1.2. Transition ...

  10. 每天一个linux命令(41):ps命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...