C#泛型列表List<T>基本用法总结
2013-10-21 10:02
239 查看
namespaceSampleListT
{
classProgram
{
staticvoidMain(string[]args)
{
//usingSystem.Collections.Generic;命名空间中的List<T>
//usingSystem.Collections; 命名空间中的ArrayList
//都实现了列表集合,一个是泛形集合,一个是非泛型的
//下面我们将Person对象加到集合中
Personp1=newPerson("aladdin",20);
Personp2=newPerson("zhao",10);
Personp3=newPerson("jacky",40);
//如果不制定list的容器大小,默认是0,只要有元素加入是,会自动扩展到4,如果第5个元素加入时,就变成了8,第9个加入,就成16
//可以看出,总是成倍的增长,扩展时要重新开辟内存,这样会影响效率,如果事先知道元素个数,或者可能个数,最好给个尽量大的权衡值
//我们加入3个元素,设容器大小为4.注:设为4不是指只能放4个元素,如果超出,一样也会成倍扩展,这样做只是为了尽量扩展带来的开销
List<Person>list=newList<Person>(4);
list.Add(p1);
list.Add(p2);
list.Add(p3);
//本方法是清除多于的没有用的内存空间,例:如果开辟大小为100,而我们只用了4个,其余的放着,是不是很浪费
//本方法调用时会检查元素个数是不是占到了容器大小的90%以上,如果是,则不进行回收.
list.TrimExcess();
//ArrayList方法与List<>用法一样,不同的是,它是对象集合,参数是Object这样会有装箱拆箱的可能,尽量用List<>
//本处不再做演示
//1初始化集合器
//C#3.0开始,提供了初始化功能,但是并没有反应到IL代码中,在IL中,一样也是把个转化成ADD方法来调用List<int>l2=newList<int>(){1,2,3,4,5};
//2添加元素AddRange()本方法可以一次性添加一批对象
List<Person>lists=newList<Person>(10);//参数是一个必须可能跌代的对象,也可是数组
list.AddRange(newPerson[]{newPerson("aladdin",20),newPerson("zhao",6)});
//构造传入批量参数,与AddRange效果一样
List<Person>mylist=newList<Person>(newPerson[]{newPerson("aladdin",20),newPerson("zhao",6)});
//3插入元素
//使用Insert()方法,可以在指定位置插入元素
//例我们在1位置插入则最后变成了aladdinjackyzhao..插入意思就是,这个位我占了,以前占这位的和他之后的,通通往后移一位
mylist.Insert(1,newPerson("jacky",88));
foreach(Personpinmylist)
{
Console.WriteLine(
}
//4访问元素
//ArrayList与List<T>都是提供了索引器来访问的
Console.WriteLine("----------------访问元素------------------------");
for(inti=0;i<mylist.Count;i++)
{
Console.WriteLine(mylist[i].name);
}
//还可以使用foreach跌代器来实现,些处不再举例
//使用Foreach方法
//publicdelegatevoidAction<T>(Tobj);例用委托做为参数
//我们Lamada表达式实现
Console.WriteLine("-----------------用ForEach方法输出------------------------");
mylist.ForEach(param=>Console.WriteLine(
//5删除元素
//删除元素可以使用RemoveAt()直接传入索引器值
//将第一个元素直接删除
mylist.RemoveAt(0);
//也可以将要删除的元素传给Remove方法
List<Person>lists2=newList<Person>(10);
Personper1=newPerson("aladdin",100);
Personper2=newPerson("zhao",100);
Personper3=newPerson("jacky",100);
lists2.Add(per1);
lists2.Add(per2);
lists2.Add(per3);
lists2.Remove(per3);
Console.WriteLine("-------删除后的元素---------");
foreach(Personperinlists2)
{
Console.WriteLine(
}
//从结果可以看出名称为Jacky的元素被删除了
//下面说一下Remove方法的删除过程
//用IndexOf方法确定出对象的索引,然后按索引删除
//在IndexOf方法内,首先检查元素是不是实现了IEquatable接口,如果是,就调用这个接口中的Equals方法
//如果没有实现,则调用Object中的Equals方法比较元素(也就是址址比较)
//以上我们删除per3,很显明显一个地址,所以被删除了
//下面我们改装了Person,实现了IEquatable<Person>,在比较方法中,始终返回false,则per3会比较失败,不会被删除
//结果3个都在
//如果要删除对象,最好使用索引直接删除,因为Remove方法经历了一系列过程后,最后才按索引删除!
//RemoveRange()删除一个范围
//第一个参数开始位置第二个个数
//lists2.RemoveRange(1,2);
//Console.WriteLine("批量删除后----------------");
//foreach(Personperinlists2)
//{
// Console.WriteLine(
//}
//6搜索
//搜索有很多种方式,可以使用IndexOfLastIndexOfFindIndexFindLasIndexFindFindLas,如果只是查看元素存不,可以使用Exists()方法
//IndexOf()方法需要将一个对象做参数,如果打到,就返回本元素在集合中的索引,如果找不到就返回-1,IndexOf还可以使用IEquatable接口来比较元素
List<Person>ls3=newList<Person>(10);
Personperson1=newPerson("aladdin",100);
Personperson2=newPerson("zhao",100);
Personperson3=newPerson("jacky",100);
ls3.Add(person1);
ls3.Add(person2);
ls3.Add(person3);
//为了使用默认的地址比较,我们把Person的接口暂时去掉
intindex=ls3.IndexOf(person3);
Console.WriteLine("per3的索引:"+index);//2
//还可以指定搜索范围从第3个开始,范围长度是1
intindex2=ls3.IndexOf(person3,2,1);
Console.WriteLine(index2);
//IEquatable比较方法前面已经写过,不再举例
//FindIndex()方法是用来搜索带有一定特性的元素
//例用委托做参数 publicdelegateboolPredicate<T>(Tobj);
intindex3=ls3.FindIndex(param=>param.name.Equals("jacky"));
Console.WriteLine(index3);//2
//FindLastIndex是从后面查第一个出现的元素,因为我们这里没有重复元素,所以体现不出他只查找一个,就停下来的效果
intindex4=ls3.FindLastIndex(p=>p.name.Equals("aladdin"));
Console.WriteLine(index4);
//Find方法与FindIndex方法用法一样,不同的是,它返回的是元素本身
Personppp=ls3.Find(p=>p.name.Equals("jacky"));
Console.WriteLine(ppp);
//如果要查找所有的匹配元素,而不是找到第一个就停下来,就使用FindAll方法
//我们查找所有年纪等于100的对象,3个都符合
List<Person>newList=ls3.FindAll(p=>p.age==100);
Console.WriteLine("----------查找所有---------");
foreach(PersonpinnewList)
{
Console.WriteLine(
}
//7排序
//List可以例用Sort方法排序,实现算法是快速排序
//本方法有好几个重载
publicvoidSort();
//只对元素实现了IComparable才能使用这个方法,如果实现了则,可以直接调用一次sort之后,就排好序了
publicvoidSort(Comparison<T>comparison);
//我们的Person并没有实现那个接口,所以要用泛型委托当参数的方法
publicvoidSort(IComparer<T>comparer);
//泛型接口当参数publicdelegateintComparison<T>(Tx,Ty);
publicvoidSort(intindex,intcount,IComparer<T>comparer);
//可以指定范围
List<Person>ls4=newList<Person>(10);
Personperson4=newPerson("aladdin",100);
Personperson5=newPerson("zhao",33);
Personperson6=newPerson("jacky",44);
ls4.Add(person4);
ls4.Add(person5);
ls4.Add(person6);
ls4.Sort(MyComparFunc);
Console.WriteLine("-------------排序后的-------------");
foreach(Personpinls4)
{
Console.WriteLine(
}
Console.WriteLine("--------颠倒循序------------------");
ls4.Reverse();
foreach(Personpinls4)
{
Console.WriteLine(
}
//8类型转换
//可以将集合中的元素转换成任意类型的元素,比如,我们要将集合中的Person转换成为Racer对象Racer只包含名字,没有年纪
//publicList<TOutput>ConvertAll<TOutput>(Converter<T,TOutput>converter);//publicdelegateTOutputConverter<TInput,TOutput>(TInputinput); 委托参数
List<Racer>ls5=ls4.ConvertAll<Racer>((input)=>newRacer(
Console.WriteLine("-----------转换后的玩意--------");
foreach(Racerrinls5)
{
Console.WriteLine(
}
//9只读集合
//在创建完集合以后,肯定是可读写的,如果不是,他就不能再添加新元素了,但是,如果是认为填充完毕,不要再做修改.//可以使用只读集合,使用AsReadOnly方法()返回ReadOnlyCollection<T>类型,它与List<>操作是一样的,但是一但有修改集合的操作,就会刨出异常
//他屏蔽了通常的ADD等方法
ReadOnlyCollection<Racer>persss= ls5.AsReadOnly();
Console.WriteLine("输出只读集合");
foreach(Racerrinpersss)
{
Console.WriteLine(
}
Console.ReadLine();
}
10.排序:
List<string>lstTmp=newList<string>();
lstTmp.AddRange(PMTCommon.GetITList());
lstTmp.AddRange(PMTCommon.GetDesignerList());
lstTmp.Sort();
11.去掉重复元素:
List<string>lstTmp=newList<string>();
lstTmp.AddRange(PMTCommon.GetITList());
lstTmp.AddRange(PMTCommon.GetDesignerList());
lstTmp=lstTmp.Distinct().ToList<string>();
lstTmp.Sort();
12.拼接
staticvoidMain(string[]args) { List<string>strList=newList<string>() { "Jake","Brian","Raj","Finnie","Carol" }; stringstr=string.Join(";",strList.ToArray()); Console.WriteLine(str); Console.ReadLine(); }
OUTPUT
13.ConvertstringarraytoList<string>
string[]arrStr={"Jake","Brian","Raj","Finnie","Carol"}; List<string>strList=newList<string>(arrStr.Length); strList.AddRange(arrStr);
//为了比较写的委托实现方法
publicstatic intMyComparFunc(Personp1,Personp2)
{
if(p1.age==p2.age)
{
return0;
}
elseif(p1.age>p2.age)
{
return1;
}
else
{
return-1;
}
}
}
//twohelperclasses
classPerson//:IEquatable<Person>
{
publicstringname;
publicintage;
publicPerson(stringname,intage)
{
this.name=name;
this.age=age;
}
////始终给一个False值
//publicboolEquals(Personother)
//{
// returnfalse;
//}
}
classRacer
{
publicstringname;
publicRacer(stringname)
{
this.name=name;
}
}
}
12.List<object> to List<string>
第一种方法:List<object>objects=newList<object>(); varstrings=(fromoinobjectsselecto.ToString()).ToList();[/code]
第二种方法:
List<string>strList=objects.ConvertAll(obj=>obj.ToString());[/code]
13.IList<T> 与List<T> 之间的相互转换
13.1将List<T>转化为IList<T>
private IList<T> ConvertToIList(System.Collections.Generic.List<T> listObjects)
{
IList<T> convertedList = new List<T>();
foreach (T listObject in listObjects)
{
convertedList.Add(listObject);
}
return convertedList;
}
譬如:
private IList<adminListInfo> ConvertToIList(System.Collections.Generic.List<adminListInfo> listObjects)
{
IList<adminListInfo> convertedList=new List<adminListInfo>();
foreach (adminListInfo listObject in listObjects)
{
convertedList.Add(listObject);
}
return convertedList;
}
13.2将IList<T>转化为List<T>
private List<T> Convert(System.Collections.IList listObjects)
{
List<T> convertedList = new List<T>();
foreach (object listObject in listObjects)
{
convertedList.Add((T)listObject);
}
return convertedList;
}
/// <summary>
/// 转换IList<T>为List<T>
/// </summary>
/// <typeparam name="T">指定的集合中泛型的类型</typeparam>
/// <param name="gbList">需要转换的IList</param>
/// <returns></returns>
public static List<T> ConvertIListToList<T>(IList gbList) where T : class
{
if (gbList != null && gbList.Count > 1)
{
List<T> list = new List<T>();
for (int i = 0; i < gbList.Count; i++)
{
T temp = gbList[i] as T;
if (temp != null)
list.Add(temp);
}
return list;
}
return null;
}
[/code]
相关文章推荐
- Mac Port 基本用法总结
- 转 C#泛型列表List<T>基本用法总结
- git基本用法总结
- C#泛型列表List基本用法总结
- JQuery基本用法总结
- cgdb基本用法总结
- 第一行代码总结:9.3服务的基本用法——服务的更多技巧(使用前台服务)
- 关于C#泛型列表List<T>的基本用法总结
- ES6基本语法的简单用法总结(1)
- Ext.GridPanel 用法总结(一)—— Grid基本用法
- Struts2总结---OGNL表达式的基本语法和用法 (8)
- php—cURL库基本用法总结
- STL基本用法总结
- mysql基本用法总结
- Rxjava基本用法总结
- 关于C#泛型列表List<T>的基本用法总结
- Android开发:SurfaceView基本用法总结及开发问题分享
- c++构造函数学习总结(基本用法)
- 绘图的一些常用API及基本用法总结
- C#泛型列表List<T>基本用法总结