C# - IList / List / 数组 以及相互之间的转换
Ilist / List
IList:首先IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口。
它仅仅是所有泛型类型的接口,并没有太多方法可以方便实用,如果仅仅是作为集合数据的承载体,确实,IList<T>可以胜任。
不过,更多的时候,我们要对集合数据进行处理,从中筛选数据或者排序。这个时候IList<T>就爱莫能助了。
1、当你只想使用接口的方法时,ILis<>这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.
2、IList <>是个接口,定义了一些操作方法这些方法要你自己去实现
List <>是泛型类,它已经实现了IList <>定义的那些方法
IList <Class1> IList11 =new List <Class1>();
List <Class1> List11 =new List <Class1>();
这两行代码,从操作上来看,实际上都是创建了一个List<Class1>对象的实例,也就是说,他们的操作没有区别。
只是用于保存这个操作的返回值变量类型不一样而已。
那么,我们可以这么理解,这两行代码的目的不一样。
List <Class1> List11 =new List <Class1>();
是想创建一个List<Class1>,而且需要使用到List<T>的功能,进行相关操作。
而
IList <Class1> IList11 =new List <Class1>();
只是想创建一个基于接口IList<Class1>的对象的实例,只是这个接口是由List<T>实现的。所以它只是希望使用到IList<T>接口规定的功能而已。
List基础、常用方法
using System; using System.Collections.Generic; namespace ListStudy { /// <summary> /// 以下没有接收返回值的方法都是属于 void方法 /// </summary> class Program { static void Main(string[] args) { List<string> lists = new List<string>(); /* 添加元素 */ //添加一个元素 lists.Add("first"); //添加多个元素 string[] temArr = { "two", "three" }; lists.AddRange(temArr); //在index位置添加一个元素 lists.Insert(0, "zero"); //遍历List中元素 foreach (string item in lists) { Console.Write(item + "/"); } //结果为:zero/first/two/three/ /* 删除元素 */ //删除一个值 bool remove = lists.Remove("first1"); //删除下表为index的元素 lists.RemoveAt(3); //超出下标会报异常 //从下标index开始,删除count个元素 lists.RemoveRange(2, 1); //超出下标或者个数超出list长度都会报异常 /* 判断某个元素是否在list中 */ bool contains = lists.Contains("firsT");//属于精确查找匹配,不是模糊匹配 Console.WriteLine(contains); /* 元素排序 */ lists.Sort(); //默认是元素第一个字母按升序 //给List里面元素顺序反转 lists.Reverse(); //注意这个需要与sort一起使用 /* list清空 */ lists.Clear(); /* list获取元素个数 */ int count = lists.Count; /* list lambda表达式 */ string[] temArr1 = { "zero", "first", "two", "three" }; lists.AddRange(temArr1); string s = lists.Find(name => { if (name.Contains("w")) { return true; } else { return false; } }); //返回第一个模糊匹配的元素 //以下方法都可以使用这种方式 //List<string> ss = lists.FindAll(); //List<string> ss = lists.FindLast(); //返回最后一个模糊匹配的元素 //bool trueForAll = lists.TrueForAll(); //确定是否 List 中的每个元素都与指定的谓词所定义的条件相匹配。比如是否每个元素的长度都超过了3 //IEnumerable<string> takeList= mList.Take(5); //获得前n行 返回值为IEnumetable<T>,T的类型与List<T>的类型一样 //IEnumerable<string> ss = lists.Where(); //检索与指定谓词所定义的条件相匹配的所有元素。跟List.FindAll方法类似。 //int num = lists.RemoveAll(); //移除与指定的谓词所定义的条件相匹配的所有元素。并返回移除的数量 Console.Write($"s:{s}"); } } }
数组
using System; namespace ListStudy { class Program { static void Main(string[] args) { //创建数组的几种方法 //第一种 string[] myArray = new string[10]; //第二种 string[] myArray2 = { "first", "two" }; //第三种 string[] myArray3 = new string[3] { "first", "two", "there" }; //第四种 string[] myArray4 = new string[] { "first", "two", "there", "four" }; //数组排序 Array.Sort(myArray4); } } }
Array类方法
using System; namespace ListStudy { class Program { static void Main(string[] args) { int[] list = { 34, 72, 13, 44, 25, 30, 10 }; Console.Write("原始数组: "); foreach (int i in list) { Console.Write(i + " "); } Console.WriteLine(); // 逆转数组 Array.Reverse(list); Console.Write("逆转数组: "); foreach (int i in list) { Console.Write(i + " "); } Console.WriteLine(); // 排序数组 Array.Sort(list); Console.Write("排序数组: "); foreach (int i in list) { Console.Write(i + " "); } Console.WriteLine(); int[] list1 = new int[3]; Array.Copy(list, list1, 3);// 源数组,目标数组, 复制长度 Console.Write("Copy数组: "); foreach (int i in list1) { Console.Write(i + " "); } Console.WriteLine(); int[] list2 = new int[3]; Array.Copy(list, 3, list2, 0, 3);// 源数组,从源数组第几个下标index开始复制,目标数组, 从目标数组的第几个下表index开始放值, 复制长度 Console.Write("Copy数组: "); foreach (int i in list2) { Console.Write(i + " "); } Console.WriteLine(); Console.ReadKey(); } } }
List 与 数组之间的相互转换
using System.Collections.Generic; namespace ListStudy { class Program { static void Main(string[] args) { //数组转List string[] temArr1 = { "zero", "first", "two", "three" }; List<string> lists = new List<string>(temArr1); //List转数组 List<int> listss = new List<int>() { 1, 2, 3, 4, 5 }; int[] temArray2 = listss.ToArray(); } } }