【005】◀▶ C#学习笔记(四)(集合)
《C#入门经典(中文第四版)》第11章 - 第x章学习笔记
---------------------------------------------------------------------------------------------------------
●·● 目录:
A1 ………… CollectionBase 类
A2 ………… DictionaryBase 类
A3 ………… List<T> 类
A4 ………… Dictionary<TKey, TValue> 类
A5 ………… ArrayList 类
A6 ………… Hashtable 类
A7 ………… 比较
A8 ………… IFields 接口
A9 ………… IQueryFilter 接口
---------------------------------------------------------------------------------------------------------
╔════════╗
╠════╣ 第A1个 ╠══════════════════════════════════════════════════╣
╚════════╝
●·● CollectionBase 类:
1. 为强类型集合提供 abstract 基类。
- 我们可以从一个类中派生自己的集合,例如System.Collection.CollecionBase类,这个抽象类提供了集合类的许多实现方式。
- CollectionBase类有借口IEnumerable、ICollection和IList,但只提供了一些要求的执行代码,特别是 IList的Clear()和RemoveAt()方法,以及ICollection和Count属性。如果要使用提供的功能,就需要自己执行其他代码。
-
View Code - CollectionBase
2. CollectionBase 属性:
- Count: 获取包含在 CollectionBase 实例中的元素数。 不能重写此属性。
- List:获取一个 IList,它包含 CollectionBase 实例中元素的列表。
3. CollectionBase 方法:
- Clear: 从 CollectionBase 实例移除所有对象。 不能重写此方法。
- RemoveAt: 移除 CollectionBase 实例的指定索引处的元素。 此方法不可重写。
---------------------------------------------------------------------------------------------------------
╔════════╗
╠════╣ 第A2个 ╠══════════════════════════════════════════════════╣
╚════════╝
●·● DictionaryBase 类:
1. 为键/值对的强类型集合提供 abstract 基类。
2. DictionaryBase 方法:
- Clear:清除 DictionaryBase 实例的内容。
3. DictionaryBase 属性:
- Count:获取包含在 DictionaryBase 实例中的元素数。
- Dictionary:获取包含在 DictionaryBase 实例中的元素的列表。
- InnerHashtable:获取包含在 DictionaryBase 实例中的元素的列表。
其他:
<1> 迭代器
- 如果要迭代一个类,可以使用方法GetEnumerator(),其返回类型是IEnumerable。
- 如果要迭代一个类成员,例如一个方法,则使用IEnumerable。
- 在迭代器块中,使用yield关键字选择要在foreach循环中使用的值。其语法如下:
- yield return value;
- 对于迭代器,可以使用下面的语句中断信息返回foreach循环的过程:
- yield break;
-
View Code - 迭代器举例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Even e = new Even(0,20);
foreach (int a in e)
{
Console.WriteLine(a);
}
}
}
public class Even : DictionaryBase
{
private int min;
private int max;
public Even(int minValue, int maxValue)
{
min = minValue;
max = maxValue;
}
public Even():this(1,10)
{
}
public IEnumerator GetEnumerator()
{
for (int i = min; i <= max;i++ )
{
if (i % 2 == 0)
if(i<=10)
yield return i; //将偶数返回foreach
else
yield break; //如果i大于10,则推出foreach
}
}
}
//0
//2
//4
//6
//8
//10
//请按任意键继续. . .
}
<2> 浅度复制(11.1.7)
- 使用受保护的方法System.Object.MemberwiseClone()进行浅度复制(shallow copy)。使用了一个GetCopy()方法,如下所示:
-
View Code - 浅度复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Cloner mySource = new Cloner(5);
Cloner myTarget = (Cloner)mySource.GetCopy();
Console.WriteLine("{0}:mySource,{1}", mySource.ToString(), mySource.MyContent.Val);
Console.WriteLine("{0}:myTarget,{1}", myTarget.ToString(), myTarget.MyContent.Val);
mySource.Val = 10;
mySource.MyContent.Val = 2;
Console.WriteLine(mySource.Val);
Console.WriteLine(myTarget.Val);
Console.WriteLine("{0}:mySource,{1}", mySource.ToString(), mySource.MyContent.Val);
Console.WriteLine("{0}:myTarget,{1}", myTarget.ToString(), myTarget.MyContent.Val);
}
}
public class Content
{
public int Val;
}
public class Cloner
{
public int Val;
public Content MyContent = new Content();
public Cloner(int newVal)
{
Val = newVal;
}
public object GetCopy()
{
return MemberwiseClone();
}
}
//ConsoleApplication3.Cloner:mySource,0
//ConsoleApplication3.Cloner:myTarget,0
//10
//5
//ConsoleApplication3.Cloner:mySource,2
//ConsoleApplication3.Cloner:myTarget,2
//请按任意键继续. . .
} - 类中的值实现深度复制,但是类中的类实现浅度复制,只是复制引用。
<3> 深度复制
- 为此,实现ICloneable 接口,该接口有一个方法Clone(),这个方法不带参数,返回一个对象类型,其签名和上面使用的GetCopy()方法相同。修改上面的类,可以使用下面的深度复制代码:
-
View Code - 深度复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Cloner mySource = new Cloner(5);
Cloner myTarget = (Cloner)mySource.Clone();
Console.WriteLine("{0}:mySource,{1}", mySource.ToString(), mySource.MyContent.Val);
Console.WriteLine("{0}:myTarget,{1}", myTarget.ToString(), myTarget.MyContent.Val);
mySource.MyContent.Val = 2;
Console.WriteLine("{0}:mySource,{1}", mySource.ToString(), mySource.MyContent.Val);
Console.WriteLine("{0}:myTarget,{1}", myTarget.ToString(), myTarget.MyContent.Val);
}
}
public class Content
{
public int Val;
}
public class Cloner : ICloneable
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
}
public object Clone()
{
Cloner clonedCloner = new Cloner(MyContent.Val);
return clonedCloner;
}
}
//ConsoleApplication3.Cloner:mySource,5
//ConsoleApplication3.Cloner:myTarget,5
//ConsoleApplication3.Cloner:mySource,2
//ConsoleApplication3.Cloner:myTarget,5
//请按任意键继续. . .
} - 类中的对象也实现了深度复制。
---------------------------------------------------------------------------------------------------------
╔════════╗
╠════╣ 第A3个 ╠══════════════════════════════════════════════════╣
╚════════╝
●·● List<T> 类:
1. 表示可通过索引访问的对象的强类型列表。 提供用于对列表进行搜索、排序和操作的方法。
2. List<T> 构造函数:
List<string> dinosaurs = new List<string>();
3. List<T> 方法:
- Add:将对象添加到 List<T> 的结尾处。
- AddRange:将指定集合的元素添加到 List<T> 的末尾。
- Clear:从 List<T> 中移除所有元素。
- Contains:确定某元素是否在 List<T> 中。
- Exists:确定 List<T> 是否包含与指定谓词所定义的条件相匹配的元素。
- Find:搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List<T> 中的第一个匹配元素。
- FindAll:检索与指定谓词定义的条件匹配的所有元素。
- FindLast:搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List<T> 中的最后一个匹配元素。
- ForEach:对 List<T> 的每个元素执行指定操作。
- IndexOf:
- Insert:
- Remove:
- RemoveAll:
- RemoveAt:
- Sort:
- ToArray:将 List<T> 的元素复制到新数组中。
4. List<T> 属性:
- Item:获取或设置指定索引处的元素。
- Count:获取 List<T> 中实际包含的元素数。
- Capacity:获取或设置该内部数据结构在不调整大小的情况下能够容纳的元素总数。
※ 参考:http://hi.baidu.com/coldwindsnow/blog/item/bfb5270025a13f1d728b6513.html
---------------------------------------------------------------------------------------------------------
╔════════╗
╠════╣ 第A4个 ╠══════════════════════════════════════════════════╣
╚════════╝
●·● Dictionary<TKey, TValue> 类:
1. 表示键和值的集合,通过引用键来调出值。
2. Dictionary类的构造函数:
- Dictionary<string, string> d = new Dictionary<string, string>();
- Dictionary<int, string> exer = new Dictionary<int, string>();
3. Dictionary类的属性:
- Count:键/值对的个数。
- Keys:键的集合。
- Values:值的集合。
- 使用索引,例如:exer[111] = "Alex" 类名[键] = 值
4. Dictionary类的方法:
- Add:将指定的键和值加入到字典中。
- Clear:清除所有键和值。
- ContainsKey:判断是否包含某键。
- ContainsValue:判断是否包含某值。
- Remove:移除指定键的值,同时将键也移除,其他自动上移。
参考1:http://www.cnblogs.com/linzheng/archive/2010/12/13/1904709.html
参考2:http://www.2cto.com/kf/201007/52242.html
---------------------------------------------------------------------------------------------------------
╔════════╗
╠════╣ 第A5个 ╠══════════════════════════════════════════════════╣
╚════════╝
●·● ArrayList 类:
---------------------------------------------------------------------------------------------------------
╔════════╗
╠════╣ 第A6个 ╠══════════════════════════════════════════════════╣
╚════════╝
●·● Hashtable 类:
---------------------------------------------------------------------------------------------------------
╔════════╗
╠════╣ 第A7个 ╠══════════════════════════════════════════════════╣
╚════════╝
●·● 比较:
1. 运算符重载
- 一元运算符: +,-, !, ~, ++,-- , true, false
- 二元运算符: +,-, *, /, %, &, |, ^, <<, >>
- 比较运算符: ==, !=, <, >, <=, >=
-
View Code - 运算符重载举例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
AddClass1 op1 = new AddClass1();
op1.val = 5;
AddClass1 op2 = new AddClass1();
op2.val = 5;
AddClass1 op3 = op1 + op2;
Console.WriteLine(op3.val);
AddClass1 op4 = -op3;
Console.WriteLine(op4.val);
Console.WriteLine(op3 > op4);
}
}
public class AddClass1
{
public int val;
public static AddClass1 operator +(AddClass1 op1, AddClass1 op2)
{
AddClass1 returnVal = new AddClass1();
returnVal.val = op1.val + op2.val;
return returnVal;
}
public static AddClass1 operator -(AddClass1 op1)
{
AddClass1 returnVal = new AddClass1();
returnVal.val = -op1.val;
return returnVal;
}
public static bool operator >(AddClass1 op1,AddClass1 op2)
{
return (op1.val > op2.val);
}
public static bool operator <(AddClass1 op1,AddClass1 op2)
{
return (op1.val < op2.val);
}
//10
//-10
//True
//请按任意键继续. . .
}
}