一、集合

** System.Collections名称空间中的几个接口提供了基本的集合功能

Ps:这里看成一个动态的链表,但是已经完美的封装好了。

(一)使用集合

1、代码示例

(1)Animal.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Exercise
{
public abstract class Animal
{
protected string name; public string Name
{
get
{
return name;
}
set
{
name = value;
}
} public Animal()
{
name = "The animal with no name";
}
public Animal(string newName)
{
name = newName;
} public void Feed()
{
Console.WriteLine("{0} has been fed", name);
}
}
}

(2)Cow.cs

namespace Exercise
{
public class Cow:Animal
{
public void Milk()
{
Console.WriteLine("{0} has been milked.", name);
} public Cow(string newName):base(newName)
{ }
}
}

(3)Chicken.cs

namespace Exercise
{
public class Chicken:Animal
{
public void LayEgg()
{
Console.WriteLine("{0} has laid an egg.", name);
} public Chicken(string newName):base(newName)
{ }
}
}

(4)Program.cs

namespace Exercise
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Create an Array type collection of Animal " + "objects and use it:"); Animal[] animalAraay = new Animal[2];
Cow myCowl = new Cow("Deirdre");
animalAraay[0] = myCowl;
animalAraay[1] = new Chicken("Ken"); foreach(Animal myAnimal in animalAraay)
{
Console.WriteLine("New {0} object added to Array collection, " + "Name = {1}", myAnimal.ToString(), myAnimal.Name);
} Console.WriteLine("Array collection contains {0} objects.", animalAraay.Length);
animalAraay[0].Feed();
((Chicken)animalAraay[1]).LayEgg();
Console.WriteLine();
Console.ReadKey(); Console.WriteLine("Create an ArrayList type collection of Animal " + "object and use it ");
ArrayList animalArrayList = new ArrayList();
Cow mycow2 = new Cow("Heylay");
animalArrayList.Add(mycow2);
animalArrayList.Add(new Chicken("Roy")); foreach(Animal myAnimal in animalArrayList)
{
Console.WriteLine("New {0} object added to ArrayList collection," + "Name = {1}", myAnimal.ToString(), myAnimal.Name);
}
Console.WriteLine("ArrayList collection contains {0} objects.", animalArrayList.Count);
((Animal)animalArrayList[0]).Feed();
((Chicken)animalArrayList[1]).LayEgg();
Console.WriteLine(); Console.WriteLine("Additional manipulation of ArrayList:");
animalArrayList.RemoveAt(0);
((Animal)animalArrayList[0]).Feed();
animalArrayList.AddRange(animalAraay);
((Chicken)animalArrayList[2]).LayEgg();
Console.WriteLine("The animal called {0} is at index {1}.", myCowl.Name, animalArrayList.IndexOf(myCowl));
myCowl.Name = "Janice";
Console.WriteLine("The animal is now called {0}.", ((Animal)animalArrayList[1]).Name);
Console.ReadKey(); }
}
}

2、运行结果

3、注意点:

(1)ArrayList创建时不需要指定初始长度值。但是Array是需要的。

(2)对于ArrayList是不强调类型的一个集合,所以再采用所属对象的方法之类的时候,必须进行强制类型转换,而对于Array来说,他是强调对象类型的集合,所以可以直接调用其方法,但是对于其派生类来说,还是需要进行强制类型转换。

(3)还有些删除(at)和扩展方法(AddRange)之类的扩展方法

(4)ArrayList需要加上using System.Collections;名字空间的引用,切记切记。

(二)定义集合

一般从已有的基类来派生自己的集合,例如System.Collections.CollectionsBase还有System.IDictonaryBase。

1、System.Collections.CollectionsBase

(1)为了便于完成任务,CollectionBase提供了两个受保护的属性List和InnerList,List可以通过IList接口访问项,InnerList则是用于储存项的ArrayList对象。

(2)一个demo

注意Add和Remove是强类型化的方法,该方法只能用于处理Animal类或者派生于Animal的类,而前面介绍的ArrayList实现代码可以处理任何的对象。

2、索引符

(1)

这种类似数组的用法必须是在提供了索引符之后才能够使用。

(2)  一个demo:添加一个数字索引。

public class Animals:CollectionBase
{ public Animal this[int animalIndex]
{
get
{
return (Animal)List[animalIndex]; //因为IList.List属性返回的是一个System.Object对象。所以要进行强制类型转换。
}
set
{
List[animalIndex]=value;
}
}
}

(3)下面我们使用Animal来构建一个Animals集合

a、创建一个Animals类

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Exercise
{
public class Animals:CollectionBase
{
public void Add(Animal newAnimal)
{
List.Add(newAnimal);
}
public void Remove(Animal newAnimal)
{
List.Remove(newAnimal);
} public Animals()
{ }
public Animal this[int animalIndex]
{
get
{
return (Animal)List[animalIndex];
}
set
{
List[animalIndex] = value;
}
}
}
}

b、修改Program.cs的代码

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Exercise
{
class Program
{
static void Main(string[] args)
{
Animals animalCollection = new Animals(); animalCollection.Add(new Cow("Jack"));
animalCollection.Add(new Chicken("SB")); foreach(Animal myAnimal in animalCollection)
{
myAnimal.Feed();
}
Console.ReadKey(); }
}
}

c、简单来说就是创建了一个Animal的集合,List是用于访问的接口,所以有Add,Remove的方法,我们还添加了索引符,最后再主函数里面实例化一个Animal集合,然后添加了两个Animal的派生类,最后使用foreach循环调用这两个对象继承于基类Animal的Feed()的方法。

C#学习笔记(九)——集合、比较和转换的更多相关文章

  1. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  2. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九

    <Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次   SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...

  3. 软件测试之loadrunner学习笔记-02集合点

    loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...

  4. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  5. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  6. Java学习笔记之---集合

    Java学习笔记之---集合 (一)集合框架的体系结构 (二)List(列表) (1)特性 1.List中的元素是有序并且可以重复的,成为序列 2.List可以精确的控制每个元素的插入位置,并且可以删 ...

  7. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

  8. Python学习笔记九

    Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...

  9. vue学习笔记(九)vue-cli中的组件通信

    前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...

  10. C#线程学习笔记九:async & await入门二

    一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...

随机推荐

  1. JavaScriptSerializer中日期序列化问题解决方案

    JavaScriptSerializer中日期序列化问题解决方案 直接进入主题: class Student { public int age { get; set; } public DateTim ...

  2. [Angularjs]ng-switch用法

    用法描述 ng-switch根据表达式的值显示或这隐藏对应部分.类似c#或者其他预览里面的switch用法.可以慢慢体会. 说道ng-switch就要说到子元素该怎么根据当前值进行变化.子元素可以通过 ...

  3. 和我一起来了解SEO

    基础知识 搜索引擎 搜索引擎爬虫会检索各个网站,分析他们的关键字,从一个连接到另一个连接,如果爬虫觉得这个关键字是有用的 就会存入搜索引擎数据库,反之如果没用的.恶意的.或者已经在数据库的,就会舍弃. ...

  4. font-family属性与字体对齐

    css中的font-family属性可以让我们自定义字体.在页面前端,宋体已经明日黄花,号称最贵中文字体的微软雅黑大行其道.英文字体万年不变,依然还是"arial","v ...

  5. 入门必看--JavaScript基础

    JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题. ...

  6. html tr td colspan

    colspan  属性规定单元格可横跨的列数, 第一行的colspan规定其一行所跨越的列数,要与下一行的<td></td>个数一致 if(!empty ($alarmDesc ...

  7. Proc 和 代码块

    文章是从个人博客 搬过来的,大家也可以直接访问我的个人博客哦http://www.iwangzheng.com/ 如何将一段代码从对象中取出并将它像对象一样传递.在ruby中,一个Proc是一个包含一 ...

  8. CSS3.0盒模型display:-webkit-box;的使用

    box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典   的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box-flex属性还没 ...

  9. MySQL性能优化的最佳经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  10. 安装mac os x时about a second remaining解决方法

    转自: http://www.hongkiat.com/blog/clean-install-mavericks/ During the installation process, you may e ...