IEnumerable,IEnumerable<T>:只有继承这个类才可以用foreach循环;
ICollection(集合):获取元素的个数
IList: 被索引;向列表中添加元素(add);可以把整个列表清空(clear):判断列表中是否包含某一项(contains);向中间指定的位置插入(insert);移除某一项(remove);移除指定位置的一项(remove at)
Array类是所有数组类型的抽象基类型,它创建了创建、操作搜索和排序数组的方法;
Array类
Array类是一个抽象类,所以不能使用构造函数来创建数组,除外,可以使用静态方法Createinstance()方法创建数组(若事先不知道元素的类型,该静态方法就非常有用,因为类型可以作为Type对象传递给CreateInstance()方法)
CreateInstance()方法的第一个参数应是元素的类型,第二个参数定义数组的大小,可以使用SetValue()方法设置对应元素的值:
//创建类型为int、大小为5的数组
static void Main(string[] args)
{
Array intArray1 = Array.CreateInstance(typeof(int), 5);
for(int i = 0;i<5;i++)
{
intArray1.SetValue(33, i);
}
for (int i = 0; i < 5; i++)
{
Console.WriteLine(intArray1.GetValue(i));
}
}
将已创建的数组强制转换成声明为int[]的数组:
int[] intArray2 = (int[])intArray1;
CreateInstance()方法:
// 创建一个包含2*3个元素的数组。第一维基于1,第二维基于10:
static void Main(string[] args)
{
int[] lengths = { 2, 3 };
int[] lowerBounds = { 1, 10 };
Array racers = Array.CreateInstance(typeof(Person), length, lowerBounds);
// SetValue()方法设置数组的元素,其参数是每一堆的索引
racers.SetValue(new Person
{
FirstName = "Alain",
LastName = "Prost"
}, 1, 10);
racers.SetValue(new Person
{
FirstName = "Emerson",
LastName = "Fittipaldi"
}, 1, 11);
racers.SetValue(new Person
{
FirstName = "fsd",
LastName = "gedr"
}, 1, 12);
racers.SetValue(new Person
{
FirstName = "ytr",
LastName = "hght"
}, 2, 10);
racers.SetValue(new Person
{
FirstName = "ytrg",
LastName = "hghtse"
}, 2, 11);
racers.SetValue(new Person
{
FirstName = "ydtr",
LastName = "hgfgdght"
}, 2, 12);
//Person[,] racers2 = (Person[,])racers;
//Person first = racers2[1, 10];
//Person last = racers2[2, 12];
}
复制数组
复制数组会使数组实现ICloneable接口,这个接口定义的Clone()方法会复制数组的浅表副本
① 如果数组的元素是值类型,以下代码就会复制所有值
int[] intArray1 = { 1, 2 };
int[] intArray2 = (int[])intArray1.Clone();
② 如果数组包含引用类型,则不复制元素,而只复制引用。
除了使用Clone()方法外还可以使用Array.Copy()方法创建浅表副本
二者区别:Clone()方法会创建一个新数组,而Copy()方法必须传递阶数相同且有足够元素的已有数组。
如果需要包含引用类型的数组的深层副本,就必须迭代数组并创建新对象
排序
Array类使用QuickSort算法对数组中元素进行排序,Sort()方法需要数组中的元素实现IComparable接口。
// 该应用程序的输出是排好序的数组
static void Main(string[] args)
{
string[] names = { "chun", "xia", "qiu", "dong" };
Array.Sort(names);
foreach (string name in names)
{
Console.WriteLine(name);
}
}
如果对数组使用自定义类,就必须实现IComparable接口。这个接口只定义了一个方法CompareTo(),如果要比较的对象相等,该方法就返回0.如果该实例应排在参数对象的前面,该方法就返回小于0的值。如果该实例应排在参数对象的后面,该方法就返回大于0的值。
数组作为参数
数组可以作为参数传递给方法,也可以从方法中返回。要返回一个数组,只需把数组声明为返回类型
枚举
在foreach语句中使用枚举,可以迭代集合中的元素,且不用知道集合中的元素个数。
Foreach语句使用IEnumerator接口的方法和属性,迭代集合中的所有元素。IEnumerator定义Current属性来返回光标所在的元素,该接口的MoveNext()方法移动到集合的下一个元素上,如果有这个元素,该方法就返回TRUE;如果集合不再有更多元素,该方法就返回FALSE。
foreach语句
使用foreach语句可以迭代集合
yield语句
使用yield语句以便创建枚举器。Yield rturn 语句返回集合的一个元素,并移动到下一个元素上,yield break可停止迭代。
元组
数组合并了相同类型的对象,元组合并了不同类型的对象。
结构比较
数组和元组都可以实现接口IStructuralEquatable和IStructuralComparable(这两个接口都是显示实现的),在使用时需要把数组和元组强制转换为这个接口。IStructuralEquatable接口用于比较两个元组或数组是否有相同的内容,IStructuralComparable接口用于给元组或数组排序
泛型优点
①性能
②类型安全 如果使用对象,就可以在这个集合中添加任意类型
③泛型允许更好地重用二进制代码。泛型类可以定义一次,并且可以用许多不同的类型实例化
泛型类型的命名规则
①泛型类型的名称用字母T作为前缀;
②如果没有特殊的要求,泛型类型允许用任意类替代,且只使用一个泛型类型,就可以用字符T作为泛型类型的名称
public class List<T>{}
public class LinkedList<T>{}
③如果泛型类型有特定的要求 (例如它必须实现一个接口或派生自基类),或者使用了两个或多个泛型,就应给泛型类型使用描述的名称:
Public class SortedList<TKey,TValue>{}
创建泛型类
在链表中,一个元素引用下一个元素,所以必须创建一个类,它将对象封装在链表中并引用下一个对象。
创建泛型类需要C#关键字,不能把null赋予泛型类型
如果泛型类需要调用泛型类中的方法,就必须添加约束。
泛型支持的约束类型(只能为默认构造函数定义构造函数约束,不能为其他构造函数定义构造函数约束)
约束
说明
where T∶ stuct
对于结构约束,类型T必须是值类型
where T:class
类约束指定类型T必须是引用类型
where T:IFoo
指定类型T必须实现接口IFoo
where T:Foo
指定类型T必须派生自基类Foo
where T:new()
这是一个构造函数约束,指定类型T必须有一个默认构造函数(公有、无参)
whcre T1:T2
这个约束也可以指定,类型T1派生自泛型类型T2。该约束也称为裸类型约束
在C#中,where字句的一个重要限制是,不能定义必须由泛型类型实现的运算符,运算符不能在接口中定义。在where字句中,只能定义基类、接口和默认构造函数。
继承
泛型类型可以实现泛型接口,也可以派生自一个类,泛型类可以派生自泛型基类:
Public class Base<T>
{
}
Public class Derived<T>:Base<T>
{
}
其要求是必须重复接口的泛型类型,或者必须指定基类的类型,如下例所示:
Public class Base<T>
{
}
Public class Derived<T>:Base<string>
{
}
静态成员
泛型类的静态成员只能在类的一个实例中共享。泛型接口
使用泛型可以定义接口,在接口定义的方法可以带泛型参数
协变和抗变
协变和抗变指对参数和返回值的类型进行转换
如果泛型类型用out关键字标注,泛型接口就是协变的。
如果泛型类型用in关键字标注,泛型接口就是抗变的。
泛型方法
泛型方法可以在非泛型类中定义
字典:一组键值对的排序
键
学号
值
学生信息
哈希表(HashTable)
散列(HashSet):提供了高性能的数学运算;
队列(queue):先进先出
Enqueue:向对尾加入一个元素
Dequeue:删除一个元素;
转载于:https://www.cnblogs.com/wanghuixia/p/9533624.html