本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。