C#集合与泛型

一、什么是集合

引自数学的一种概念,表示一组具有共同性质的数学元素的组合,例如:实数集合、有理数集合

虽然集合引用自数学,但也可以扩展成表示一组具有共同性质的元素的集合,这里的元素可以是人、物等,在面向对象的程序设计中,集合表示一组具有相同性质的对象,是对各种集合类进行实例化的结果。

集合中包含的对象称为集合元素。集合分为泛型集合类和非泛型集合类。

(泛型集合可以理解为指定了数据类型的动态集合)

二、数组

数据也是一种集合,要表示一组数据的集合,最常用的办法就是用数组。

1.数组:一组具有相同类型的数据(变量或对象)的集合,如一组证书、一组字符等

2.数组的定义:

-元素类型:给定类型的数组只能保存相同类型的元素

-数组维数和长度

3.数组的遍历:

-foreach语句进行遍历

static void traversing()

{

int[] MyArray={12,25,27,89};

foreach(int number in MyArray)

{

Console.WriteLine(number);

}

Console.ReadLine();

}

4.数组的排序

-升序:Array.Sort(数组名)

-反转:Array.Reverse(数组名)

5.数组的问题

-数组的大小是固定的,在声明数组时必须指定数组的长度,数组的长度过长会造成内存的浪费。数组长度过短又可能有溢出的风险

-数据类型的单一性,数组只能表示一组相同类型的元素,无法表示复杂的数据结构

解决办法:C#提供了ArrayList对象来克服这些缺点

三、数组列表ArrayList

1.ArrayList的特点:其大小是按照其中存储的数据来动态扩充与收缩的,在声明时不需要指定它的长度,即一个动态数组

2.声明方式

方式一:ArrayList aList=new ArrayList();

public static void aList1()

{

ArrayList alist = new ArrayList(); //声明一个ArrayList对象

for(int i = 0; i < 10; i++) //给其添加10个int类型的元素值

{

alist.Add(i);

Console.WriteLine(alist[i]);

}

Console.ReadKey();

}

方式二:ArrayList alist=new ArrayList(arrayName);

先定义一个普通数组,再将数组中的元素赋值给数据列表ArrayList

public static void aList2()

{

  int[] arr=new int[]{11,22,33,44,55,66,77,88};

  ArrayList alist=newArrayList(arr);

  for(int i=0;i<aList.Count;i++)

  {

   Console.WriteLine(aList[i]);

  }

}

3.添加、移除元素

aList.Add(i);//在集合末尾添加元素i

aList.Insert(2,i);//在指定位置添加元素i

aList.Remove(i);//移除第一个匹配的元素i

aList.RemoveAt(3);//移除指定位置的元素

aList.Clear();//移除所有元素

aList.RemoveRange(3,5);//移除一定范围内的元素

4.ArrayList的问题

-拆箱和装箱:ArrayList非常方便,它不像数组只能存储一种指定的数据类型,ArrayList可以存储任何引用类型和值类型,但是这种便利的代价是需要把任何一个加入ArrayList的引用类型或值类型都隐式地转化成Object类型(所有类的超类),因此在存储或检索这些值类型的时候通常发生装箱和拆箱操作。

装箱:将值类型的数据打包到引用类型的实例中

比如将string类型的值abc赋给object对象objString s=”abc”;object obj=(object)s;

拆箱:从引用类型数据中提取值类型

比如将object对象obj的值赋给string类型的变量sobject obj=”abc”;string s=(string)obj;

装箱和拆箱的操作降低了系统的性能

-类型安全:缺乏编译时的类型检查,ArrayList把任何类型都转换成Object,但把String和int变量放在一个ArrayList中在进行数据处理时会发生错误

解决办法:代码在实例化之前指定所需的特定数据类型,这样编译器就可以同时进行类型检查,而且不需要将类型转换成Object,即ArrayList需要一个类型参数,于是就有了泛型集合

四、泛型集合List

1.声明

泛型集合用List<T>表示,它是ArrayList类的泛型等效类,区别在于,在声明List集合时,同时需要为其声明List集合内数据的类型。

定义方式一:

List<T> alist=new List<T>();

定义方式二:

List<T> aList=new List<T>(arrayName);

public static void List1()

{

  String [] arr=new String[]{"Heaven","Chris"};

  List<string> alist=new List<string>(arr);

  foreach(string s in alist)

{

  Console.WriteLine(s);

}

}

2.List的属性与方法

Count属性,用于获取数组中当前元素数量Item() 通过指定索引获取或设置元素。对于List类来说,它是一个索引器。Add() 在List尾部添加一个元素的方法AddRange() 在List尾部添加一组元素Clear() 在List内移除所有元素Any()测试一个元素是否在List内Contains() 测试一个元素是否在List内CopyTo() 把一个List拷贝到一维数组内Exists() 测试一个元素是否在List内Find() 查找并返回List内的出现的第一个匹配元素FindAll() 查找并返回List内的所有匹配元素Getrange() 拷贝指定范围的元素到新的List内

IndexOf()重载的公有方法,查找并返回每一个匹配元素的索引Insert()在List内插入一个元素InsertRange()在List内插入一组元素LastIndexOf()重载的公有方法,,查找并返回最后一个匹配元素的索引Remove()移除与指定元素匹配的第一个元素RemoveAt()移除指定索引的元素RemoveRange()移除指定范围的元素Reverse()反转List内元素的顺序Sort()对List内的元素进行排序ToArray()把List内的元素拷贝到一个新的数组内trimToSize()将容量设置为List中元素的实际数目

五、LINQ查询简介

1.简介:LINQ是在C#中引入的类似于SQL的查询模式,支持几乎任何类型的数据源,是一组基于C#语言的扩展语句,使用C#程序代码以查询数据库相同的方式操作内存数据

2.简单的例子

有如下两个字符串和整数元素组成的数组,请编写一段代码实现如下功能:

-找出所有姓张的人

-找出大于50的值,并进行排序。

string[] names={"张三","李四","王五","张国荣"};

int[] score={19,53,56,49,88,53,95};

publicstaticvoidlinqexp1()

{

string[]names={"张三","李四","王五","张国荣"};

//linq查询语句

varresults=fromainnames

wherea.StartWith("张")

selecta

Console.WriteLine("姓张的有:");

ShowList(results.ToArray());

}

publicstaticvoidlinqexp2()

{

int[]score={19,53,56,49,88,53,95};

varresults=frombinscore

whereb>=50

orderbyb

selectb;

ShowList(results.ToArray());

}

常用表达式:from子句指定数据源,where子句指定筛选条件,select子句指定返回的元素。

完整关键字:

-基本子句:from、where、select、group、orderby、join

-定义变量子句:into、let

-辅助关键字:in、on、equals、by、ascending、descending

六、Lambda表达式(点标记方法)

1.什么是Lambda

我们知道,对于一个Java变量,我们可以赋给其一个“值”

如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?

比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的Java变量:

在Java 8之前,这个是做不到的。但是Java 8问世之后,利用Lambda特性,就可以做到了。

当然,这个并不是一个很简洁的写法。所以,为了使这个赋值操作更加elegant, 我们可以移除一些没用的声明

图源网络(侵删)

这样,我们就成功的非常优雅的把“一块代码”赋给了一个变量。而“这块代码”,或者说“这个被赋给一个变量的函数”,就是一个Lambda表达式(至于Lambda表达式的语法规则,请听下回分解啦

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容