3常用数据类型的用法

mac2022-06-30  296

IEnumerableIEnumerable<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


最新回复(0)