,,C# List介绍及具体用法

,,C# List介绍及具体用法

本文主要介绍C# List的介绍和具体用法。通过示例代码非常详细,对大家的学习或者工作都有一定的参考价值。有需要的朋友下面跟边肖学习。

一、# List泛型集合

集合是OOP中的一个重要概念,C#对集合的全面支持是该语言的精髓之一。

为什么要用泛型集合?

在C# 2.0之前,集合主要通过两种方式实现:

A.使用数组列表

将直接对象放入ArrayList很直观,但是由于集合中的项都是对象类型,所以每次使用都需要进行繁琐的类型转换。

B.使用自定义集合类

常见的做法是从CollectionBase抽象类继承一个自定义类,并通过封装IList对象来实现强类型集合。这种方法需要为每种集合类型编写相应的自定义类,这需要大量的工作。泛型的出现很好地解决了上述问题,只需要一行代码就可以创建一个指定类型的集合。

什么是泛型?

泛型是C# 2.0中的新元素(C中称为模板),主要用于解决一系列类似的问题。这种机制允许类名作为参数传递给泛型类型,并生成相应的对象。理解泛型(包括类、接口、方法、委托等)可能更好。)作为模板,模板中的变体部分将被作为参数传入的类名所替换,从而获得一个新的类型定义。泛型是个大话题,这里就不详细分析了。有兴趣的可以参考相关资料。

怎样创建泛型集合?

集合主要是利用系统下的ListT泛型类创建的。集合。通用命名空间。语法如下:

ListT list oft=new ListT();

其中“t”是要使用的类型。它可以是简单类型,如string和int,也可以是用户定义的类型。我们来看一个具体的例子。

按如下方式定义人员分类:

阶级人士

{

私有string _ name//名称

private int _ age//年龄

//创建一个人对象

公众人物(字符串名称,整数)

{

这个。_ name=Name

这个。_age=年龄;

}

//名称

公共字符串名称

{

获取{ return _ name}

}

//年龄

公共互联网

{

get { return _ age}

}

}

//创建一个人对象

人p1=新人('张三',30);

人p2=新人('李四',20);

人p3=新人('王五',50);

//创建Person类型的对象集合

list person persons=new list person();

//将Person对象放入集合

人。添加(P1);

人。添加(p2);

人。添加(P3);

//输出第二个人的名字

控制台。写(个人[1])。姓名);

如您所见,泛型集合极大地简化了集合的实现代码,通过它,您可以轻松地创建指定类型的集合。不仅如此,泛型集合还提供了更强大的功能。让我们来看看排序和搜索。

泛型集合的排序

排序是基于比较的。要排序,先比较。例如,有两个数字1和2。要对它们进行排序,首先要对这两个数字进行比较,根据比较结果进行排序。如果要比较对象,情况会复杂一点。比如比较Person对象,可以按名字比较,也可以按年龄比较,所以需要确定比较规则。一个对象可以有多个比较规则,但只能有一个默认规则,该规则放在定义该对象的类中。默认的比较规则是在CompareTo方法中定义的,该方法属于IComparableT泛型接口。请看下面的代码:

类人:IComparablePerson

{

//按年龄比较

公共国际比较(人员p)

{

归还这个。年龄- p .年龄;

}

}

CompareTo方法的参数是另一个要比较的同类型对象,返回值是int类型。如果返回值大于0,则意味着第一个对象大于第二个对象。如果返回值小于0,则意味着第一个对象小于第二个对象。如果返回0,则两个对象相等。

定义默认比较规则后,您可以通过不带参数的排序方法对集合进行排序,如下所示:

//根据默认规则对集合进行排序

人。sort();

//输出所有者的姓名

foreach(人员中的人员p)

{

控制台。WriteLine(p . Name);//输出顺序是‘李四’、‘张三’、‘王五’

}

在实践中,经常需要根据各种不同的规则对集合进行排序,因此需要定义其他比较规则,这些规则可以在Compare方法中定义,该方法属于IComparerT泛型接口。请看下面的代码:

类名比较器:IComparerPerson

{

//存储排序器实例

public static name comparer Default=new name comparer();

//按名称比较

公共int比较(人员p1,人员p2)

{

返回系统。collections . comparer . default . compare(P1。名字,p2。姓名);

}

}

Compare方法的参数是要比较的同类型的两个对象,返回值的类型为int。返回值处理规则与CompareTo方法的规则相同。比较器在哪里?Default返回内置的比较器对象,用于比较两个相同类型的对象。

使用下面新定义的比较器对集合进行排序:

//按名称对集合进行排序

人。Sort(NameComparer。默认);

//输出所有者的姓名

foreach(人员中的人员p)

{

控制台。WriteLine(p . Name);//输出顺序是‘李四’、‘王五’、‘张三’

}

您还可以按委托对收藏进行排序。首先,您需要定义一个委托调用的方法,该方法用于存储比较规则。您可以使用静态方法。请看下面的代码:

班级人员比较

{

//按名称比较

公共静态int名称(人员p1,人员p2)

{

返回系统。collections . comparer . default . compare(P1。名字,p2。姓名);

}

}

该方法的参数是两个相同类型的待比较对象,返回值类型为int,返回值处理规则与CompareTo方法相同。然后通过内置的通用委托系统对集合进行排序。比较:

系统。比较人名比较=新

系统。ComparisonPerson(人员比较。姓名);

人。排序(name comparison);

//输出所有者的姓名

foreach(人员中的人员p)

{

控制台。WriteLine(p . Name);//输出顺序是‘李四’、‘王五’、‘张三’

}

如您所见,后两种方法可以根据指定的规则对集合进行排序,但是作者更喜欢使用委托方法。可以考虑把各种比较规则放在一个类里,然后灵活调用。

泛型集合的搜索

搜索是从集合中找到满足特定条件的项目。您可以定义多个搜索条件,并根据需要调用它们。

首先,按如下方式定义搜索标准:

类人称谓词

{

//找出中年人(40岁以上)

公共静态布尔MidAge(人p)

{

如果(年龄=40)

返回true

其他

返回false

}

}

以上搜索条件放在一个静态方法中,方法的返回类型为Boolean。集合中满足特定条件的项目返回true,否则返回false。然后通过内置的通用委托系统搜索集合。预测:

系统。predicate person midage predicate=新系统。predicate person(person predicate。MidAge);

list person midage persons=persons。find all(midage predicate);

//输出所有中年人的姓名

foreach(中期人员中的人员p)

{

控制台。WriteLine(p . Name);//输出“王五”

}

泛型集合的扩展

如果我想得到集合中所有人的名字,用逗号分隔,该怎么做?

考虑到单个类所能提供的功能有限,很自然会想到扩展ListT类。泛型类也是类,所以可以通过继承来扩展。请看下面的代码:

//定义Persons集合类

类别人员:列表人员

{

//获取集合中所有人的姓名

公共字符串GetAllNames()

{

如果(这个。计数==0)

返回“”;

字符串值=“”;

foreach(此处的个人p)

{

val=p.Name ',';

}

返回瓦尔。子串(0,val。长度-1);

}

}

//创建并填充Persons集合

Persons PersonCol=new Persons();

PersonCol。添加(P1);

PersonCol。添加(p2);

PersonCol。添加(P3);

//输出所有者的姓名

控制台。写(PersonCol。GetAllNames());//输出“张三,李四,王五”

二、List的方法和属性 方法或属性 作用

Capacity用于获取或设置列表中可以容纳的元素数量。当数量超过容量时,该值将自动增加。您可以设置该值来减少容量,或者调用trin()方法来减少容量以适应实际的元素数量。

属性,该属性用于获取数组中元素的当前数目。

Item()通过指定的索引获取或设置元素。对于List类,它是一个索引器。

Add()将对象的公共方法添加到列表中。

Add()公共方法,在列表末尾添加一系列实现ICollection接口的多个元素。

BinarySearch()重载的公共方法,用于在排序列表中通过二分搜索法定位指定的元素。

Clear()删除列表中的所有元素。

Contains()测试一个元素是否在列表中。

CopyTo()重载公共方法,将列表复制到一维数组中。

Exists()测试一个元素是否在列表中。

Find()查找并返回列表中的第一个匹配元素。

Find()查找并返回列表中所有匹配的元素。

GetEnumerator()重载公共方法,并返回用于迭代列表的枚举数。

Getrange()将指定范围内的元素复制到新列表中。

Index()重载公共方法来查找并返回每个匹配元素的索引。

Insert()在列表中插入元素

Insert()在列表中插入一组元素

LastIndexOf()重载的公共方法查找并返回最后一个匹配元素的索引。

Remove()移除与指定元素匹配的第一个元素。

RemoveAt()移除指定索引的元素。

RemoveRange()移除指定范围的元素。

Reverse()反转列表中元素的顺序

Sort()对列表中的元素进行排序

ToArray()将列表中的元素复制到一个新的数组中。

TrimToSize()将容量设置为列表中元素的实际数量。

三、List的用法

1、List的基础、常用方法:

(1)声明:

、ListT mList=new ListT();

t是列表中的元素类型,现在以字符串类型为例。

Liststring mList=new Liststring();

、ListT test list=new ListT(IEnumerableT集合);

创建以集合为参数的列表:

string[] temArr={ 'Ha ',' Hunter ',' Tom ',' Lily ',' Jay ',' Jim ','洪毓',' Locu ' };

Liststring test list=new Liststring(temArr);

(2)添加元素:

添加一个元素。

语法:List。添加(测试项目)

Liststring mList=new Liststring();

mList。添加('约翰');

添加一组元素。

语法:list . add range(ienumerablecollection)

Liststring mList=new Liststring();

string[] temArr={ 'Ha ',' Hunter ',' Tom ',' Lily ',' Jay ',' Jim ','洪毓',' Locu ' };

mList。add range(temArr);

在索引位置添加一个元素。

语法:Insert(int index,T item);

Liststring mList=new Liststring();

mList。插入(1,'黑');

遍历列表中的元素

语法:

foreach(mList中的T元素)//T的类型与声明mList时相同。

{

控制台。WriteLine(元素);

}

示例:

Liststring mList=new Liststring();

.//省略部分代码。

foreach(mList中的字符串s)

{

控制台。写线;

}

(3)删除要素:

删除一个值。

语法:List。移除(测试项目)

mList。删除(' Hunter ');

删除带有索引index的元素。

语法:list . remo vat(int index);

mList。remove at(0);

从下标索引开始,删除计数元素

语法:list.removerange (int index,int count);

mList。RemoveRange(3,2);

(4)确定元素是否在列表中:

语法:List。包含(T项)返回值为:真/假

如果(mList。包含(' Hunter '))

{

控制台。WriteLine('列表中有亨特');

}

其他

{

mList。添加('猎人');

控制台。WriteLine('成功添加猎人。');

}

(5)对列表中的元素进行排序:

语法:List。Sort()默认为按升序排列的元素的第一个字母。

mList。sort();

(6)颠倒列表中元素的顺序:

语法:List。Reverse()可以与List一起使用。Sort()达到想要的效果。

mList。反向();

(7)清空列表:

语法:List。清除()

mList。clear();

(8)获取列表中元素的数量:

语法:List。Count()返回一个整数值

int count=mList。count();

控制台。WriteLine('列表中的元素数:' count ');

2、List的进阶、强大方法:

本段中使用的列表作为示例:

string[] temArr={ 'Ha ',' Hunter ',' Tom ',' Lily ',' Jay ',' Jim ','洪毓',' Locu ' };

mList。add range(temArr);

(1)、列表。FindAll方法:检索与指定谓词定义的条件相匹配的所有元素。

语法:public listt find all(预测t匹配);

Liststring子列表=mList。find all(list find);//委托给ListFind函数

foreach(子列表中的字符串s)

{

控制台。WriteLine(子列表中的“元素:”s);

}

此时,子列表存储所有长度大于3的元素。

(2)、列表。Find方法:搜索与指定谓词定义的条件匹配的元素,返回整个列表中第一个匹配的元素。

语法:public T Find(predicate T match);

谓词是方法的委托。如果传递给它的对象与委托中定义的条件匹配,则该方法返回true。当前列表的元素被逐个传递给谓词委托,并在列表中向前移动,从第一个元素开始,到最后一个元素结束。当找到匹配时,处理停止。

谓词可以委托给函数或lambda表达式:

委托给Ramda表达式:

list find=mList . find(name=//name是一个变量,代表mlist中的元素。自己设置。

{

如果(姓名。长度3)

{

返回true

}

返回false

});

控制台。WriteLine(list find);//输出是Hunter

委托给一个函数:

string listFind1=mList。查找(list find);//委托给ListFind函数

控制台。WriteLine(list find);//输出是Hunter

//ListFind函数

public bool ListFind(字符串名)

{

如果(姓名。长度3)

{

返回true

}

返回false

}

两种方法的结果是一样的。

(3)、列表。FindLast方法:搜索与指定谓词定义的条件匹配的元素,并返回整个列表中最后一个匹配的元素。

语法:public t find last(预测t匹配);

与List用法相同。发现

(4)、列表。TrueForAll方法:确定列表中的每个元素是否匹配指定谓词定义的条件。

语法:public bool true for all(预测t匹配);

委托给Ramda表达式:

bool标志=mList。TrueForAll(名称=

{

如果(姓名。长度3)

{

返回true

}

其他

{

返回false

}

});

控制台。WriteLine(' True for all:' flag);//标志值为

委托给一个函数。这里使用了上面的ListFind函数:

bool标志=mList。TrueForAll(list find);//委托给ListFind函数

控制台。WriteLine(' True for all:' flag);//标志值为假

两种方法的结果是一样的。

(5)列表。Take(n)方法:前n行的返回值为IEnumetableT,t的类型与ListT的类型相同。

IEnumerablestring takeList=mList。取(5);

foreach(take list中的字符串s)

{

控制台。WriteLine(' take list中的'元素:' s ');

}

此时,存储在takeList中的元素就是mList中的前五个元素。

(6)、列表。Where方法:检索与指定谓词定义的条件相匹配的所有元素。类似于列表。FindAll方法。

IEnumerablestring where list=mList。其中(名称=

{

如果(姓名。长度3)

{

返回true

}

其他

{

返回false

}

});

foreach(子列表中的字符串s)

{

控制台。子列表中的WriteLine('元素

此时,子列表存储所有长度大于3的元素。

(7)、列表。RemoveAll方法:删除与指定谓词定义的条件相匹配的所有元素。

语法:public int remove all(预测t匹配);

mList。RemoveAll(名称=

{

如果(姓名。长度3)

{

返回true

}

其他

{

返回false

}

});

foreach(mList中的字符串s)

{

控制台。WriteLine(mList中的“元素:”s);

}

此时,mList在删除大于3的长度后存储元素。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 设计一个简单的C#控制台应用程序,C#控制台程序,C# 创建控制台应用程序
  • 深入解析windows第8版,深入解析C#(第4版)
  • 数组代码,c# 数组操作,C# 数组实例介绍(图文)
  • 学会C#要多久,学会c#要多久,c#学习之30分钟学会XAML
  • 回溯法01背包问题c,回溯法求解01背包问题伪代码,C#使用回溯法解决背包问题实例分析
  • xml文件转义字符,xml转意字符,C# XML中的转义字符操作
  • winform 进度条控件,c# 进度条使用
  • winform 进度条控件,c# 进度条使用,C#使用winform实现进度条效果
  • winform backgroundworker,c# isbackground
  • winform backgroundworker,c# isbackground,C# BackgroundWorker用法详解
  • lua与c#交互,lua c#
  • lua与c#交互,lua c#,ToLua框架下C#与Lua代码的互调操作
  • linq c#,linq原理 c#
  • linq c#,linq原理 c#,c#中LINQ的基本用法实例
  • java decimal保留两位小数,sql中decimal函数保留2位小数,C#中decimal保留2位有效小数的实现方法
  • 留言与评论(共有 条评论)
       
    验证码: