我是靠谱客的博主 标致樱桃,最近开发中收集的这篇文章主要介绍黑马程序员-自学笔记-集合相关(重难点)集合相关(重难点),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

集合相关(重难点)

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

1、集合
1)集合可以看做是封装了大量方法的动态数组
2)集合是对象列表,通过实现System.Collections中的接口来获得接口
集合的功能可以通过接口来实现,通过接口可以创建自定义集合类
可以定制强类型的集合类
可以提供专用的方法
3)System.Collections
IEnumerable 可以迭代集合中的项
ICollection 继承自IEnumerable,获得集合中的个数,并将项复制到一个简单数组中
IList 继承自IEnumerable、ICollection,提供集合项列表,及其他功能
IDictionary 继承自IEnumerable、ICollection,提供键值访问的项列表

4)ArrayList也实现了IList、ICollection和IEnumerable

2、定义集合
1)创建自己的集合
1、手写
2、从抽象类CollectionBase中继承

public class <ClassName> : CollectionBase

{

// 添加的方法

public void Add(<typeName> <newName>)

{

List.Add(<newName>); // ArrayList提供的受保护成员,可以直接访问存储的变量本身

}

// 定义删除的方法

public void Remove(<typeName> <oldName>)

{

List.Remove(<oldName>) // IList提供的Add、Remove方法

}

public <ClassName>()

{

// 构造方法

}

// 定义索引器

public <typeName> this[int index]

{

get

{

return (typeName)List[index]; // List中为object类型,需要强制转换

}

// set

// {

// List[index] = value;

// }

}


// 定义复制的方法

// 将本类集合中的数据复制到另一个同类型的集合中

public void CopyTo(<ClassName> <name>)

{

for(int i = 0; i < this.Count; i++) // Count为ICollection提供的属性

{

<name>.Add(this[i]);

}

}

// 定义判断是否存在某个元素

public bool Contains(<typeName> <name>)

{

return InnerList.Contains(<name>); // InnerList为CollectionBase提供的受保护方法

}

}


3、关键字值集合和IDictionary
1)集合还可以实现IDictionary接口,实现键值访问的方式
CollectionBase实现IList、ICollection和IEnumerable
DictionaryBase实现IDictionary、ICollection和IEnumerable
2)DictinaryBase中有个受保护的字段Dictionary(IDictionary类型)来实现对数据实体的访问(?)

public class <ClassName> : DictionaryBase

{

pulic void Add(string newId, Person newPerson)

{

Dictionary.Add(newId, newPerson);

}

public void Remove(string personId)

{

Dictionary.Remove(personId);

}

public <ClassName>()

{

}

public Person this[string personId]

{

get

{

return (Person)Dictionary[personId];

}

}

}


4、DictionaryBase与CollectionBase的区别一点事键值关系和索引关系,另一个即为foreach方式
1)CollectionBase的派生类可以直接通过foreach访问得到对应的项
2)DictionaryBase的派生类foreach得到的是DictionaryEntry结构类型,通过Key和Value可以访问对应的键和值

foreach(DictionaryEntry myDictionaryEnty in <DictionaryBaseSubClassName>)

{

myDictionaryEntry.Value... // 得到里面的值

}


5、迭代器
1)IEnumerable接口提供了能foreach的能力
2)foreach迭代collectionObject的过程如下
-> 调用collectionObject的GetEnumerator()方法,得到一个IEnumerator的引用(IEnumerable中定义了该方法)
-> 调用IEnumerator所指对象的MoveNext()方法
-> 如果MoveNext()方法返回true,则使用IEnumerator的Current属性获得对象的一个引用,用于foreach循环
-> 如果返回的是false循环停止
3)如此要重写很多方法,跟踪索引、维护Current属性、执行其他代码等

可以使用迭代器来简单的实现(简化的替代品)

迭代器是一个代码块,提供按顺序提供foreach所要的结果

迭代器可以是一个方法、属性等

迭代器的放回类型是IEnumerable或IEnumerator

若是使用对象迭代得到结果,使用IEnumerator返回类型,并重写GetEnumerator()方法

若是使用成员迭代得到结果,使用IEnumerable返回类型,只需提供对应方法或属性即可

迭代语法为

yield return <需要返回的内容>;

在迭代中遇到

yield break;

则会中断

在迭代的过程中yield会处理索引和Current属性等信息,执行到yield后,会停在该处,返回foreach循环,当执行in时,再次回到上次迭代位置,继续执行

实际上迭代器会被编译器解释为一个嵌套类来实现


4)对于字典集合的迭代,可以使用覆盖基类方法的形式提供GetEnumerator()方法来实现

在类中添加代码

public new IEnumerator GetEnumerator()

{

foreach(object o in <CollectionName>.Values)

{

yield return (<ClassName>)o;

}

}

那么在Main方法中就可以像之前一样使用foreach进行使用了


6、浅度复制与深度复制

Object提供了一个受保护方法MemberwiseClone(),返回当前对象的浅表副本

public class <ClassName>
{
// 其他成员

public object MyClone()
{
return MemberwiseClone();
}
// 其他成员
}

复制的时候使用

<ClassName> <name2> = (<ClassName>)<name1>.MyClone();

但是如果成员中有引用类型,那么复制后引用类型依旧保持同一个对象,因此如果需要使两个对象独立,需要深度复制

可以重写MyClone()方法,也可以使用.Net提供的标准方式:实现ICloneable接口,用Clone方法替代MyClone方法

public class <ClassName>
{
// 其他成员

public object MyClone()
{
<ClassName> temp = new <ClassName>();
// 完成复制操作,实际上就是重新创造一个
// 代码过程
return temp;
}
// 其他成员
}

如果引用类型的某个字段还是引用类型,同样需要使用刚方式实现,好像一个递归一样


7、类型比较
可以使用typeof()运算符比较某个对象是否为某个类型

if(<实例名>.GetType() == typeof(<ClassName>))
{
// 当对象是该类型时执行操作
}

8、装箱(boxing)与拆箱(unboxing)

装箱就是将值类型“赋值”给object或它实现的接口类型,拆箱就是还原

装箱拆箱过程中引用类型依旧保持地址的复制,即装箱后,原来结构中引用类型结果的改变,拆箱后会有影响

9、is运算符

<实例名> is <TypeName>

<TypeName>是一个类、接口,如果实例能被其引用,则返回true

<TypeName>是一个值类型,如果实例能被拆箱,返回true


10、值比较
运算符重载(本质就是函数?)

[访问修饰符] static 返回类型 operator 运算符(参数列表)
{
// 实际运算方式
return 返回结果;
}

注意:不要将签名相同的运算符添加到多个类中,实际运算时,操作数与重载中的参数顺序应一致

允许重载的运算符

一元运算符:+、-、!、~、++、--、true、false

二元运算符:+、-、*、/、%、&、|、^、<<、>>

比较运算符:==、!=、<、>、<=、>=

注意:重载true或false,可以将对象作为bool变量来使用,像if(<实例名分>){ ... }


11、IComparable和IComparer接口

这两个接口是.Net Framework中比较对象的标准方式

IComparable提供一个CompareTo()的方法标准,该方法接收一个对象,可以比较自己和另一个对象

IComparer提供一个Compare()的方法接口,该方法接收两个对象,比较任意两个对象(一般在单独的类中实现)

这两个接口均返回一个int类型


12、Comparer类介绍

在命名空间Syatem.Collections中,类Comparer实现了IComparer接口

可以对简单的类型和实现了IComparable接口的类型进行指定方式的比较(特定文化,比较规则)

可以使用
Comparer.Default.Compare(对象1, 对象2)
来进行比较

注意事项:

1、看比较对象是否支持IComparable,如果支持就使用其实现代码

2、允许为null,表示小于一切

3、字符串使用当前“文化”来处理。需要定义规则,Comparer必须实例化,规则由System.Globalization.CultureInfo对象来指定

4、字符串区分大小写,如果不区分使用CaseInsensitiveComparer类


13、使用IComparable和IComparer接口实现对集合的排序

ArrayList的Sort()方法实现排序

首先看对象是否实现了IComparable接口,如果实现就按照实现的方式进行排序

如果想重新排序,可以写一个类实现IComparer接口,以参数的形式提交给Sort()方法

14、转换

重载的方式提供转换的实现

定义隐式转换使用关键字 implicit
定义显示转换使用关键字 explicit

转换顺序与定义顺序相同: 变量1 = 变量2 对应参数 类型1(类型2 value)

语法:
[访问修饰符] static [implicit|explicit] operator 目标类型(待转类型 value)
{
目标类型 o = new 目标类型();
// 赋值操作,显示转换中可以将赋值操作用checked{...}块包起来,如果放不下就异常
return o;
}

15、as运算符

对象 as 类型

对象若是该类型、继承该类型或装箱到该类型中,则返回转换后的类型,否则返回null


---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

最后

以上就是标致樱桃为你收集整理的黑马程序员-自学笔记-集合相关(重难点)集合相关(重难点)的全部内容,希望文章能够帮你解决黑马程序员-自学笔记-集合相关(重难点)集合相关(重难点)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部