C# 数组之List<T>
一、引言
List<T>是ArrayList的泛型等效类,底层数据结构也是数组。
- 相比Array而言,可以动态的拓展数组长度、增删数据
- 相比ArrayList而言,由于声明的时候就已经规定 了 存储的数据类型<T>,因此,不存在对值类型的装箱和拆箱,性能得到提高。
二、函数
声明之前需要引用命名空间:using System.Collections.Generic;
初始化:
List<int> list =new List<int>{ 1,2,3};
或者
List<int> list =new List<int>();
list.Add(123);
属性:
|
名称 |
描述 |
|
Count |
实际个数 |
|
Capacity |
最大容量 |
方法:
|
函数名 |
方法 |
|
Add 添加(单个) |
void Add(T item); 将数据添加到数组末尾 |
|
AddRange 添加(多个) |
AddRange(IEnumerable<T> collection); |
|
Insert 插入 |
void Insert(int index, T item); |
|
Clear 删除数据 |
void Clear(); 将数据全部删除 |
|
Remove 移除 |
bool Remove(T item); 移除数组中第一个item,并不是全部 |
|
void RemoveAt(int index); 将下标为index的数据移除 |
|
|
void RemoveRange(int index, int count); 将下标起始为index,长度为count的一段数据移除 |
|
|
int RemoveAll(Predicate<T> match); 将满足条件的全部删除 |
|
|
Contains(T) 包含 |
bool Contains(T item); 判断数组是否包含item数据 |
|
Find 查找 |
T Find(Predicate<T> match); 搜索与指定谓词条件所匹配的元素,返回第一个匹配元素 |
|
List<T> FindAll(Predicate<T> match); 搜索与指定谓词条件所匹配的元素,返回全部匹配元素 |
|
|
int FindIndex(Predicate<T> match); 搜索与指定谓词条件所匹配的元素,返回第一个匹配元素的下标 |
|
|
T FindLast(Predicate<T> match); 搜索与指定谓词条件所匹配的元素,返回最后一个匹配元素 |
|
|
int FindLastIndex(Predicate<T> match); 搜索与指定谓词条件所匹配的元素,返回最后一个匹配元素的下标 |
|
|
Indexof 查找 |
int IndexOf(T item); |
|
int IndexOf(T item, int index); |
|
|
int IndexOf(T item, int index, int count); |
|
|
GetRange 获得子串 |
List<T> GetRange(int index, int count) 返回从index开始,长度为count的数据 |
|
Reverse 翻转 |
void Reverse(); 将数组翻转 |
|
Sort 排序 |
void Sort(); |
|
void Sort(IComparer<T> comparer); |
|
|
void Sort(int index, int count, IComparer<T> comparer); |
|
|
void Sort(Comparison<T> comparison); |
|
|
CopyTo 复制 |
CopyTo(T[] array); 将整个数据复制到array里面,前提array数据长度>=源数组 |
|
CopyTo(T[] array, int arrayIndex); 从目标数组array的下标arrayIndex开始,将整个数据,复制目标数组。 前提同上。 |
|
|
CopyTo(int index, T[] array, int arrayIndex, int count); 从目标数组array的下标arrayIndex开始,将源数组从index开始,复制count个数据到目标数组。 前提同上。 |
数据访问:
List是数组,因此支持下标直接访问
List[index] = value
三、重点函数讲解:
【删除Remove】
- bool Remove(T item); 移除数组中第一个item,并不是全部
void RemoveAt(int index); 将下标为index的数据移除
void RemoveRange(int index, int count); 将下标起始为index,长度为count的一段数据移除
- int RemoveAll(Predicate<T> match); 将满足条件的全部删除
前三个删除都特别简单,第四个RemoveAll可能见到的不多,但是又经常有这样的需求。下面结合例子讲解一下int RemoveAll(Predicate<T> match):
例子:将List里面,包含"zxs"的字符串全部删除。
方式1:委托给函数
static bool IsContains_zxs(string str)
{
if (str.Contains("zxs"))
return true;
return false;
} public static void Main()
{
List<string> list = new List<string> { "zz","aacc","ss","zzzxssss","zxs","hello" };
list.RemoveAll(IsContains_zxs);
foreach (var e in list)
{
Console.Write(e + " ");
}
}
输出结果:
zz aacc ss hello
方式2:委托给拉姆达表达式
public static void Main()
{
List<string> list = new List<string> { "zz","aacc","ss","zzzxssss","zxs","hello" }; list.RemoveAll( str=>
{
if (str.Contains("zxs"))
return true;
return false;
}); foreach (var e in list)
{
Console.Write(e + " ");
}
}
输出结果:
zz aacc ss hello
【查找Find】
- List<T> FindAll(Predicate<T> match); 搜索与指定谓词条件所匹配的元素,返回全部匹配元素
- .....xxx........ 其余几个Find函数,可类比
仔细看,发现Find 的参数是 Predicate<T>类型的。下面结合例子讲解详细使用方法:
例子:在list里面插入数据,然后利用FindAll函数找到所有大于等于5的数据。
方式1:委托给一个函数
static bool BigThen5(int value)
{
if (value >= )
return true;
return false;
} public static void Main()
{
List<int> list= new List<int> { ,,,,}; Predicate<int> pre = BigThen5;
List<int> list_result = list.FindAll(pre); Console.Write("下面是满足条件的数据:");
foreach (var e in list_result)
{
Console.Write(e + " ");
}
}
输出结果:
下面是满足条件的数据:5 13 9
方式2:委托给拉姆达表达式
public static void Main()
{
List<int> list = new List<int> { ,,,,,,,,,}; List<int> list_result = list.FindAll( value => {
return value >= 5 ? true : false;
} ); Console.Write("下面是满足条件的数据:");
foreach (var e in list_result)
{
Console.Write(e + " ");
}
}
输出结果:
下面是满足条件的数据:7 6 8 5 9 8 8
一般的查找,只是查找一个特定的数据,数据比较简单。但是想筛选复杂的数据,要么自己写函数封装,要么就可以利用List.FindAll函数来完成:在特定函数里面,将筛选条件补齐就好。
Predicate是对方法的委托,如果传递给它的对象与委托中定义的条件匹配,则该方法返回 true。当前 List 的元素被逐个传递给Predicate委托,并在 List 中向前移动,从第一个元素开始,到最后一个元素结束。当找到匹配项时处理即停止。
【排序Sort】
void Sort(IComparer<T> comparer);
一般的Sort()函数太简单,不再讲解,讲解下 参数为IComparer<T>的排序。下面结合例子,讲解;
方式1:
class M_CMP : IComparer<int>
{
//降序
int IComparer<int>.Compare(int x, int y)
{
if (x < y)
return ;
else
return -;
}
}
public static void Main()
{
List<int> list = new List<int> { ,,,,,,,,,}; list.Sort(new M_CMP()); foreach(var e in list)
{
Console.Write(e+" ");
}
}
输出结果:
方式2:
static int CMP(int a,int b)
{
//降序
return b-a;
} public static void Main()
{
List<int> list = new List<int> { ,,,,,,,,,}; list.Sort(CMP); foreach(var e in list)
{
Console.Write(e+" ");
}
}
输出结果:
9 8 8 8 7 6 5 4 4 1
四、总结
(1)即确保了类型安全。
(2)也取消了装箱和拆箱的操作。
(3)它融合了Array可以快速访问的优点以及ArrayList长度可以灵活变化的优点。
(4)在决定使用IList<T> 还是使用ArrayList类(两者具有类似的功能)时,记住IList<T> 类在大多数情况下执行得更好并且是类型安全的。
(5)如果对IList<T> 类的类型 T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型 T 使用值类型,则需要考虑实现和装箱问题。
(6)添加到ArrayList 中的任何引用或值类型都将隐式地向上强制转换为Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。---微软
C# 数组之List<T>的更多相关文章
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- JavaScript常见的五种数组去重的方式
▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...
- js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的
题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...
- javascript数组查重方法总结
文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- 小兔JS教程(四)-- 彻底攻略JS数组
在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...
随机推荐
- apace搭建站点
Listen 127.0.0.1:3310<VirtualHost *:3306> ServerName 127.0.0.1:3306 DocumentRoot "F:/Baid ...
- ES6 Set数据结构
Set ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. const s = new Set(); // const声明一个只读的常量.一旦声明,常量的值就不能 ...
- Java多线程编程核心 - 对象及变量的并发访问
1.什么是“线程安全”与“非线程安全”? “非线程安全”会在多个线程对同一对象总的实例变量进行并发访问时发生,产生的后果是“脏读”,也就是取到的数据其实是被更改过的. “线程安全”是以获得的实例变量的 ...
- utf8_general_ci和utf8_unicode_ci的比较
看到很多数据库的设计对于中文字符都是选择选用utf8_general_ci而非utf8_unicode_ci utf8_general_ci和utf8_unicode_ci的区别并不大:utf8_un ...
- ORA-00600: internal error code, arguments: [6749], [3], [12602196]
环境信息:Linux5.8 oracle10.2.0.4 问题现象: 现象1:alert日志有大量下面的错误信息: Wed Aug 27 21:01:27 2014Errors in file /u0 ...
- 分享知识-快乐自己:初始 Struts2 (基本概念)及 搭建第一个Demo
1):struts2 的基本概念: 1-1):Struts2 是什么? 1.Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2 ...
- BJOI2018爆零记
没啥可说的 Day1 0分 T1 给你一个二进制串,每次修改一个位置,询问[l,r]区间中有多少二进制子串重排后能被3整除 T2 一个无向图(无重边自环)每个点有一个包含两种颜色的染色集合,一个边的两 ...
- 主库报 Error 12154 received logging on to the standby PING[ARC2]
主备网络配置存在问题 一系列报错 [root@node1 bin]# ./srvctl start database -d devdbPRCR-1079 : Failed to start reso ...
- POCO库中文编程参考指南(8)丰富的Socket编程
POCO库中文编程参考指南(8)丰富的Socket编程 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.com (# ...
- ipv4 ipv6简介
互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(IP Address),在Internet上,一种给主机编址的方式.常见的IP地址,分为 ...