C#集合1

在说集合之前,先来个小插曲——里氏转换

——里氏转换

里氏转换的两个特性

  1. 子类可以赋值给父类:如果有一个地方需要父类作为参数,我们可以给一个子类代替
  2. 如果父类中装的是子类对象,那么可以将这个父类对象强制转换为对应的子类对象

is和as用于类型的强制转换

is——如果能转换成功,则返回true,否则返回false

//假设有两个类,一个Person类,一个Son类
//Son类继于Person类
Person p = new Son();
if(p is Son){
    Son s = (Son)p;
}else{
    Console.WriteLine("转换失败")
}

as——如果能转换则返回一个对应类型的对象,否则返回null

//那么上面的转化就可以这样玩儿
Person p = new Son();
Son s = p as Son;

——ArrayList集合

集合解决了数组固定长度的缺陷,ArrayList集合包容多种元素类型,也解决了数组元素类型单一的缺陷

//创建一个集合对象
ArrayList list = new ArrayList();

ArrayList的方法

  • 新增元素

    • Add( )——添加单个元素,末尾添加
    • AddRange( )——添加集合,末尾添加,是吧集合中的每个元素提取出来添加
    • Insert(指定索引,插入内容)——在指定的索引前插入单个元素
    • InsertRange(指定索引,插入的集合)——在指定位置前插入一个集合
  • 删除元素
    • Clear( )——清空集合
    • Remove(要删除的元素)——删除指定元素
    • RemoveAt(下标)——删除指定下标的元素
    • RemoveRange(开始位置,结束位置)——删除指定范围内的元素
  • 其他方法
    • Sort( )——升序排列
    • Reverse()——翻转
    • Contains(指定内容)——判断指定内容是否存在
ArrayList list = new ArrayList();
list.Add(1);
list.Add(2.0);
list.Add("hello");
list.Add("world");
//集合的元素数量用Count来表示,不是Length
for (int i = 0; i < list.Count; i++)
{
    Console.Write(list[i]+"\t");
}
//输出   1       2       hello   world

再来一个例子

//上面添加的都是一些值类型,那么我们看看添加引用类型会怎样
ArrayList list = new ArrayList();
list.Add("hello");
list.Add(new int[] { 1, 2, 3, 4 });
for (int i = 0; i < list.Count; i++)
{
    Console.Write(list[i]+"\t");
}
//输出  hello   System.Int32[]——这是数组的命名空间
//如果要输出的不是命名空间,则需要使用AddRange()方法添加集合
//为什么会输出命名空间呢,添加到ArrayList集合中的每个元素都会被转换成Object类型
//由于object类是所有类的父类(基类),所以才允许往集合中添加任意的数据类型

上面例子的优化

ArrayList list = new ArrayList();
list.Add("hello");
list.Add(new int[] { 1, 2, 3, 4 });
for (int i = 0; i < list.Count; i++)
  {
    //判断是不是由数组转换成的object[],里氏转换
     if (list[i] is int[])
        {
        //(int[])list[i])转换成子类数组,里氏转换
          for (int j = 0; j < ((int[])list[i]).Length; j++)
            {
              Console.Write(((int[])list[i])[j]+"\t");
            }
         }
         else {
               Console.Write(list[i]+"\t");
              }
  }
  //输出   hello   1       2       3       4
  //上面这个过程就发生了拆箱和装箱的操作,影响性能,但是没办法
  //拆箱:引用类型转换成值类型
  //装箱:值类型转换成引用类型
  //拆箱和装箱的前提都是要有继承关系

集合的长度问题:

每次集合中实际包含的元素个数(count)超过了可以包含的元素的个数(capcity)的时候,

集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用。

Hashtable集合

Hashtable集合是一个键值对集合,在键值对集合中是根据键去找值的,键必须是唯一的,Count获取Hashtable集合中键值对的数目

  • Hashtable的新增数据

    • Add——这个方法添加相同的键会抛异常,所以一般先进行Contains判断
    • [“键”]=值——这样的形式添加数据,如果计划和中已经有了这个键,则原有的键会被覆盖
Hashtable _hs = new Hashtable();
if (!_hs.Contains("姓名")) {
     _hs.Add("姓名", "张三");
 }
 _hs["性别"] = "男";

遍历Hashtable的方法

foreach(var  集合中的每一项  in  集合名称){

}

例子1、

Hashtable ht = new Hashtable();
ht["name"] = "HelloWorld";
ht["hobby"] = "Programming";
foreach (var key in ht.Keys)
{
     Console.Write(hs[key]+"\t");
}
//输出:  HelloWorld      Programming
//ht.Keys指定了键组成的集合,key在每次循环中代表键集合中的值

例子2、

Hashtable ht = new Hashtable();
ht["name"] = "HelloWorld";
ht["hobby"] = "Programming";
foreach (var value in ht.Values)
{
    Console.Write(value+"\t");
}
//输出:  HelloWorld      Programming
//ht.Values指定了值组成的集合,key在每次循环中代表值集合中的值
  • Hashtable集合的方法

    • Contains和(键名)——判断是否拥有指定键
    • ContainsKey(键名)——判断是否拥有指定键(常用这个)
    • Clear()——清空
    • Remove(键名)——移除
时间: 2025-01-14 08:29:25

C#集合1的相关文章

数组、字符串、集合

数组与集合的转换.数组与字符串的转换 ========数组变集合 String[] arr = {"abc","cc","kkkk"}; //把数组变成list集合有什么好处? /* 可以使用集合的思想和方法来操作数组中的元素. 注意:将数组变成集合,不可以使用集合的增删方法. 因为数组的长度是固定. contains. get indexOf() subList(); 如果你增删.那么会产生UnsupportedOperationExcepti

C#语言中数组和集合

数组.集合→用于储存多个同类型的数据数组 定长→用于保存固定数量的数据 在功能上,数组能实现的所有功能,集合都能实现:反之,集合能实现的某些功能,数组难以实现 占用内存少 便利速度快集合 不定长→保存的数据数量,可以在程序的执行过程中,发生变化 占用内存多 便利速度慢课时六:数组和集合 数组.集合→用于储存多个同类型的数据 数组 定长→用于保存固定数量的数据 在功能上,数组能实现的所有功能,集合都能实现:反之,集合能实现的某些功能,数组难以实现 占用内存少 便利速度快 集合 不定长→保存的数据数

通过反射了解集合泛型的本质

通过反射了解集合泛型的本质 import java.lang.reflect.Method; import java.util.ArrayList; /** * 通过反射了解集合泛型的本质 * @author shm * */ public class MethodDemo02 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("hello"); list.add(

Java 之集合

collection(单列集合) List(有序,可重复) ArrayList     底层数据结构是数组,查询快,增删慢,线程不安全,效率高 Vector     底层数据结构是数组,查询快,增删慢,线程安全,效率低 LinkedList  底层数据结构是链表,查询慢,增删快,线程不安全,效率高 Set(无序,唯一) HashSet   底层数据结构是哈希表,依赖hashCode()和equals() 执行顺序:判断hashCode()是否相同,相同继续执行equals(),返回true不添加

集合和三元运算符

一.三元运算符 如下判断可以使用三元运算更方便的实现: a = 1b = 2 if a > 1: c = aelse: c = b 和下面是一样的: a = 1b = 2#下面这个c = a if a>1 else b 如下两种方法也是一样的:方式一: s=[]nums = list(range(1,11))for i in nums: if i%2==0: s.append(i)print(s)方式二:ss = [i for i in nums if i%2==0]print(ss)#这两种

集合函数 day4

1.集合 通过set强制转换,或者直接定义 1 nums = [0, 2, 4, 6, 8]#两种格式,带大括号与带中括号的 2 print(type(nums)) 3 aa = {0, 8, 2, 4, 6}#需要注意与字典的区别,字典是有分号的 2.交集

js算法集合(一) 水仙花数 及拓展(自幂数的判断)

js算法集合(一) ★ 最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,希望能对大家有所帮助. 1.验证一个数是否为水仙花数 ①要写水仙花数的算法,我们首先来了解一下什么是水仙花数,水仙花数是指一个 3位正整数 ,它的每个位上的数字的 3次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153): ②了解了什么是水仙花数我们就开始分析该怎么下手.通过定义来看

笔记:多线程-集合

阻塞队列(BlockingQueue) 当试图向队列添加元素而队列已满,或是想从队列移除元素而队列为空的时候,阻塞队列导致线程阻塞,阻塞队列接口定义如下,他继承Queue<E>接口: public interface BlockingQueue<E> extends Queue<E> { ????/** ???? * 添加一个元素,如果队列满,则抛出 IllegalStateException异常 ???? */ ????????boolean add(E e); ??

SQL入门之集合操作

尽管可以在与数据库交互时一次只处理一行数据,但实际上关系数据库通常处理的都是数据的集合.在数学上常用的集合操作为:并(union),交(intersect),差(except).对于集合运算必须满足下面两个要求: 两个数据集合必须具有同样数目的列 连个数据集中对应列的数据类型必须是一样的(或者服务器能够将其中一种类型转换为另一种类型) SQL语言中每个集合操作符包含两种修饰:一个包含重复项,另一个去除了重复项(但不一定去除了所有重复项). 0.union操作符 union和union all操作

Java—集合框架List

集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组织(针对作用与意义一样的属性,将他们放到一个集合中) 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中快速的插入或删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 与数组相比 数组的长度