目录
1.创建列表2.添加元素3.插入元素4.访问元素5.删除元素6.搜索7.排序8.类型转换9.只读集合.NET Framework为动态列表List提供泛型类List
1.创建列表
创建一个赛车手类,下面的例子会用到:
public class Racer : IComparable, IFormattable { public int Id { get; private set; } public string FirstName { get; set; } public string LastName { get; set; } public string Country { get; set; } public int Wins { get; set; } public Racer(int id, string firstName, string lastName, string country) : this(id, firstName, lastName, country, wins: 0) { } public Racer(int id, string firstName, string lastName, string country, int wins) { this.Id = id; this.FirstName = firstName; this.LastName = lastName; this.Country = country; this.Wins = wins; } public override string ToString() { return String.Format("{0} {1}", FirstName, LastName); } public string ToString(string format, IFormatProvider formatProvider) { if (format == null) format = "N"; switch (format.ToUpper()) { case null: case "N": // name return ToString(); case "F": // first name return FirstName; case "L": // last name return LastName; case "W": // Wins return String.Format("{0}, Wins: {1}", ToString(), Wins); case "C": // Country return String.Format("{0}, Country: {1}", ToString(), Country); case "A": // All return String.Format("{0}, {1} Wins: {2}", ToString(), Country, Wins); default: throw new FormatException(String.Format(formatProvider, "Format {0} is not supported", format)); } } public string ToString(string format) { return ToString(format, null); } public int CompareTo(Racer other) { if (other == null) return -1; int compare = string.Compare(this.LastName, other.LastName); if (compare == 0) return string.Compare(this.FirstName, other.FirstName); return compare; } }
调用默认的构造函数,就可以创建列表对象。在List
var intList = new List(); var racers =new List ();
使用默认的构造函数创建一个空列表。元素添加到列表中后,列表的容量就会扩大为可接纳4个元素。如果添加到第五个元素,列表的大小就会重新设置为包含8个元素。如果8个元素还不够,列表的大小就会重新设置为包含16个元素。每次都会将列表容量重新设置为原来的2倍。
如果列表的容量改变了,整个集合就会重新分配到一个新的内存块中。在List
ListintList = new List (10);
使用Capacity属性可以获取和设置集合的容量:
intList.Capacity = 20;
集合的元素个数用Count属性读取。
如果已经将元素添加到列表中,且不希望添加的更多的元素,就可以调用TrimExcess()方法,去除不需要的容量。但是,因为重新定位需要时间,所以如果元素的个数超过了容量的90%,该方法就什么也不做。
intList.TrimExcess();
还可以使用集合初始值给集合赋值:
var intList = new List(){1,2};
集合初始值并没有反映在已编译的程序集的IL代码中,编译器会把集合初始值变成对初始值列表中的每一项调用Add()方法。
2.添加元素
使用Add()方法可以给列表添加元素:
intList.Add(1); intList.Add(2);
使用AddRange()方法,可以一次给集合添加多个元素。因为AddRange()方法的参数是IEnumerable
intList.AddRange( new Int[]{1,2} );
如果在实例化列表时知道集合的元素个数,就亦可以将实现IEnumerable
var intList = new List( new Int[]{1,2} );
3.插入元素
使用Insert()方法可以在指定位置插入元素:
intList.Insert(3,4);
方法InsertRange()可以插入大量的元素。
racers.InsertRange(3, new Racer[] { new Racer(12, "Jochen", "Rindt", "Austria", 6), new Racer(22, "Ayrton", "Senna", "Brazil", 41) });
4.访问元素
实现了IList和IList
int i = intList[0;]
String类也可以通过索引访问字符:
string s = "sdas"; char c = s[0];
因为List
foreach(int i in intList) { //.. }
除了使用foreach语句之外,List
public void ForEach(Actionaction);
.NEt实现ForEach()方法的代码如下:
public class List:ILIst { private T[] items; //... public void ForEach(Action action) { if(action==null) throw new ArgumentNullException("action"); foreach(T item in items) { action(item); } } }
实例:
racers.ForEach( r => { Console.WriteLine(r.ToString()) } );
这里使用了lambda表达式(https://www.jb51.net/article/244054.htm)。
5.删除元素
删除元素时,可以利用索引,也可以传递要删除的元素:
var graham = new Racer(7, "Graham", "Hill", "UK", 14); var emerson = new Racer(13, "Emerson", "Fittipaldi", "Brazil", 14); var mario = new Racer(16, "Mario", "Andretti", "USA", 12); var racers = new List(20) { graham, emerson, mario }; racers.RemoveAt(3); racers.Remove(graham);
按索引删除比较快,因为必须在集合中搜索要删除的元素。Remove方法先在集合中搜索,用IndexOf方法获取元素的索引,再使用该索引删除元素。IndexOf方法先检查元素类型是否实现了IEquatable
RemoveRange()方法可以从集合中删除许多元素。它的第一个参数指定了开始删除的元素索引,第二个参数指定了要删除的元素个数:
int index = 3; int count = 5; racers.RemoveRange(index,count);
要删除集合中的所有元素,可以使用ICollection
racers.Clear();
RemoveAll()方法删除有指定特性的所以元素。这个方法使用Predicate
6.搜索
获得要查找的元素的索引,或者搜索元素的本身。可以使用的方法有IndexOf(),LastIndexOf(),FindIndex(),FindLastIndex(),Find(),FindLast().
如果只检查元素是否存在,可以使用Exists()方法。
IndexOf()方法需要将一个对象作为参数,如果在集合中找到该元素,这个方法就返回该元素的索引。如果没有找到就返回—1.IndexOf方法使用IEquatable
使用IndexOf()方法,还可以指定不需要搜索整个集合,指定从哪个元素开始搜索以及搜索几个元素。
除了使用IndexOf()方法搜索指定元素之外,还可以搜索有某个特性的元素,该特性可以用FindIndex(),FindLastIndex(),Find(),FindLast()方法来定义,这些方法需要一个Predicate
如:
public int FindIndex(Predicatematch);
Predicate
public delegate bool Predicate(T obj);
其用法和Foreach()方法的Action委托类似。如果Predicate
FindIndex(),FindLastIndex()方法返回找到的匹配元素的一个索引;Find(),FindLast()返回这个匹配的元素。
如果要获得与Predicate
Listl = racers.FindAll(r => r.Wins > 20);
7.排序
List
Sort()方法有多个重载的方法。可以传递泛型委托Comparison
public void List.Sort(); public void List .Sort(Comparison ); public void List .Sort(IComparer ); public void List .Sort(Int32,Int32,IComparer );
只有集合中的元素实现了IComparable接口,才能使用不带参数的Sort()方法。
使用public void List
public class RacerComparer : IComparer{ public enum CompareType { FirstName, LastName, Country, Wins } private CompareType compareType; public RacerComparer(CompareType compareType) { this.compareType = compareType; } public int Compare(Racer x, Racer y) { if (x == null && y == null) return 0; if (x == null) return -1; if (y == null) return 1; int result; switch (compareType) { case CompareType.FirstName: return string.Compare(x.FirstName, y.FirstName); case CompareType.LastName: return string.Compare(x.LastName, y.LastName); case CompareType.Country: result = string.Compare(x.Country, y.Country); if (result == 0) return string.Compare(x.LastName, y.LastName); else return result; case CompareType.Wins: return x.Wins.CompareTo(y.Wins); default: throw new ArgumentException("Invalid Compare Type"); } } }
客户端代码:
racers.Sort(new RacerComparer(RacerComparer.CompareType.Country));
使用public void List
客户端代码:
racers.Sort((r1,r2) => r2.Wins.CompareTo(r1.Wins));
使用Reverse()方法,可以逆转整个集合的顺序。
8.类型转换
使用List
//定义一个Person类 public class Person { private string name; public Person(string name) { this.name = name; } public override string ToString() { return name; } }
客户端代码:
Listpersons = racers.ConvertAll ( r => new Person(r.FiastName+" " + r.LastName) );
9.只读集合
创建集合后,它们就是可读写的。但是,在填充集合后,可以使用AsReadOnly()方法创建只读集合。
Listracers2 =racers.AsReadOnly();
到此这篇关于C#集合之列表的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?