如何了解一个类
我还只是一个在学习中的学生,我发出来的是自己的理解,希望大神们轻喷。。
l 首先了解这个类的基本功能,能帮助你处理什么。从基本的属性了解,再逐步了解类中的方法。在了解他的可扩展方法。测试并使用这些属性和方法
l 存在父类,可以了解父类的功能,知道继承这个父类的子类的共性。为什么要这样做。
好处及帮你完成的事,试着自己写一个子类,模拟这些功能。
l 尝试使用类时,转到定义查看他的说明,并了解异常的说明,防止使用时产生这样的异常。发生异常可以常看异常说明解决异常。
l 在实际操作中建议在看的时候在 MSDN 查看这个类, 并且使用VS来验证使用每一个属性方法,并且记录下来。没有研究出来的标识为疑问,并保留已经尝试使用这个方法或属性的操作。
l 测试时可能用到很多类建议做类库存放,代码可以保留是一个参考资料,一个方法见建议region起来并且要知道里面具体包含什么,如图
泛型约束的研究
List<T>类
- 泛型集合
a) 使用的方法
i. List<T> T是一个占位符,可以接收任意类型。就是产生响应类型的集合。
b) 例子
i. List<string> list=new List<string>();
ii. 新建了一个类型为string的List集合。
- 属性
a) Capacity
b) TrimExcess() 如果Capacity大于Count,就清除List中没有使用的空间。
c) 所以Capacity的存在是为了TrimExcess清除List中没有使用的空间的
- Count
a) 获取List<T>中包含的项的个数。
- Item
a) 获取或设置位于指定索引处的项
- 方法
a) Add()
i. 将对象添加到List<T>集合里的结尾处
b) AddRange()
i. 将指定集合里的项添加到 结尾
ii. 例子
- list.AddRange(list_2); 填入被添加的集合这样list里就有了list_2的所有项并在结尾添加。
c) AsReadOnly()
d) 返回当前List<T>集合包装成的只读IList<T>集合,接收的IList<T>类型要和当前集合一样
e) 例子
i. List<string> list=new List<stirng>();
ii. IList<string>=list.AsReadOnly();
- BinarySearch(T)
a) 判断括号中传入的值在已排序的List<T>中的位置。
b) 例子
i. 传入一个值BinarySearch(“c”),类型要和集合一样。得到一个返回值,可以配合insert使用,
ii. Int index= list.BinarySearch(“c”); list.insert(~index,”c”);
- BinarySearch(T,Icomparer<T>)
a) T传入一个和当前List集合同类型的值,定位的对象,对于引用类型可以为null,Icomparer<T>写一个类继承自这个接口,写入自己的代码。将继承好的类放入第二个参数则会运行里面的代码并会传入list里面的项,如果list是空则不会运行里面的代码(没有满足实现接口的方法中需要的参数)。具有返回值。(返回该项从零开始的索引)如果不传入第二个参数,如果为空则用默认的比较器。
b) 例子
i. Public Class My_Comparer : IComparer<int>
{
Public int Compare(int x,int y)
{
If(x.CompareTo(y)!=0)
{
Return x.CompareTo(y);
}
}
比较两个对象并返回一个值,指示一个对象是小于、等于还是大于另一个对象。
参数:
x:要比较的第一个对象。
y:要比较的第二个对象。
}
List<int> list_int=new List<int>();
list_int.Add(1);
list_int.Add(2);
My_Comparer My_Com=new My_Comparer();
Int index=list_int.BinarySearch(int,My_Com);
- BinarySearch(Int32,Int32,T,Icomparer<T>)
a) 传入两个int类型的值,在这个范围内搜索项,T传入一个要定位的对象,对于引用类型可以为null。第四个侧传入实现了Icomparer<T>接口的类。如果为空则用默认的比较器。
- Clear()
a) 移除List<T>中的所有元素
- Contanis()
a) 填入一个值判断集合中是否存在对应的项,返回bool值,和当前List集A合类型一致
b) 有则返回true没有返回false,
- ConvertAll<TOutput>
a) 把当前List<T> 集合转换为另一种类型,返回包含转换后的元素列表
b) 例子
i. List<string> list_string=new List<string>();
list_string.Add(“2”);
list_string.Add(“3”);
List<int>
list_Int=list_string.ConvertAll<int>(new Convert<string,int>(StringToInt);
public static int StringToInt(string str)
{
Return Convert.ToInt32(str);
}
- CopyTo(T[])
a) 把List集合复制到类型一样的数组中,从目标数组的开头开始放置。
b) 例子
i. List<int> list_int=new List<int>();
list_int.Add(1);
list_int.Add(2);
list_int.Add(3);;
int[] ArryInt=new int[3];
list_int.CopyTo(ArryInt);
- CopyTo(T[],Int32)
a) 把List集合复制到类型一样的数组中,从目标数组的指定索引位置开始放。
b) 例子
i. List<int> list_int=new List<int>();
list_int.Add(1);
list_int.Add(2);
list_int.Add(3);;
int[] ArryInt=new int[7];
list_int.CopyTo(ArryInt,3);就会从索引为3的位置开始放1、2、3
- CopyTo(Int32,T[],Int32,Int32)
a) 第一个Int32传入的是List<T>中的开始位置从零开始。
b) 第二个是把List集合复制到类型一样的数组中。
c) 第三个是从目标数组的指定索引位置开始放。
d) 第四个是要从List开始复制的位置,要复制多少个的个数。
- Equals(Object)
a) 比较hiding的对象是否等于当前对象继承了Object
所以可以重写这个方法。
- Eists
a) 自己写一个方法传入 返回值必须为bool ,会把list集合中的每个项都传进自己写的方法,接受的类型必须和list保持一致。
b) 例子
i. static bool Exists_void(string str)
{
if(s == ”a”)
{
return true;
}
else
{
return false;
}
}
ii. List<string> list_Exists=new List<string>();
List_Exists.Add(“a”);
List_Exists.Add(“b”);
List_Exists.Add(“c”);
bool is_bool=list_Exists.Exists(Exists_void);//传入a、b、c到这个方法
//is_bool=true 因为在我写的方法里找到a就返回true如果找不到就会返回false;
- Finalize
- Find
a) Find()括号里要传一个委托,返回值为bool,为true会返回找到的第一个匹配项。
可以在自己的方法里面判断要找到的项。如果匹配成功返回true,list返回当前这个list中的项、
- FindAll
a) 传入一个委托,具有返回值,返回值为bool,可以在自己的方法里面判断要找到的项。如果匹配成功返回true,list返回当前这个list中的项。
b) 例子
i. List<string> list1 = new List<string>();
list1.Add("a");
list1.Add("b");
list1.Add("c");
list1.Add("b");
List<string> listFindAll = list1.FindAll(
delegate(string str)
{ return str.Contains("b"); }
);
foreach (string item in listFindAll)
{
Console.WriteLine(item);
}
- FindIndex(Predicate<T>)
a) 传入一个委托,具有返回值,返回值为bool,可以在自己的方法里面判断要找到的项。如果匹配成功返回true,list返回当前这个list中的项的第一个的索引值。否则为-1
- FindIndex(Int32,Predicate<T>)
a) Int32传入的是List<T>中的开始位置,从零开始。
b) 第二个传入一个委托,具有返回值,返回值为bool,可以在自己的方法里面判断要找到的项。如果匹配成功返回true,list返回当前这个list中的项的第一个的索引值。否则为-1
- FindIndex(Int32,Int32,Predicate<T>)
a) 第一个Int32传入的是List<T>中的开始位置从,零开始。
b) 第二个是把Int32是要搜索多少个项。
c) 第三个传入一个委托,具有返回值,返回值为bool,可以在自己的方法里面判断要找到的项。如果匹配成功返回true,list返回当前这个list中的项的第一个的索引值。否则为-1
- FindLast
a) FindLast()括号里要传一个委托,返回值为bool,为true会返回找到的最后一个匹配项。
可以在自己的方法里面判断要找到的项。如果匹配成功返回true,list返回当前这个list中的项、
- FindLastIndex(Predicate<T>)
a) 传入一个委托,具有返回值,返回值为bool,可以在自己的方法里面判断要找到的项。如果匹配成功返回true,list返回当前这个list中的项的最后一个的索引值。否则为-1
- FindLastIndex(Int32,Predicate<T>)
a) Int32传入的是List<T>中的开始位置,从零开始。
b) 第二个传入一个委托,具有返回值,返回值为bool,可以在自己的方法里面判断要找到的项。如果匹配成功返回true,list返回当前这个list中的项的最后一个的索引值。否则为-1
- FindLastIndex(Int32,Int32,Predicate<T>)
a) 第一个Int32传入的是List<T>中的开始位置从,零开始。
b) 第二个是把Int32是要搜索多少个项。
c) 第三个传入一个委托,具有返回值,返回值为bool,可以在自己的方法里面判断要找到的项。如果匹配成功返回true,list返回当前这个list中的项的最后一个的索引值。否则为-1
- ForEach
a) 传入一个委托,会把list中每一个项传进去,和list类型一致,
方法中可以对每一个list进行指定处理。
- GetEnumerator
a) 留给foreach内部实现的方法。返回的是循环访问集合的枚举数
- GetHashCode
a) 获得这个list的哈希值。
- GetRange
a) 返回一个List集合用相同类型来接收。
b) 例子
i. List<string> list=new List<string>();
ii. List<string> list_Test= list.GetRange(1,3);
//表示从list集合中返回索引为1到索引为3的list项。
- GetType
a) 放回当前项的类型。
- IndexOf(T)
a) 传入你要匹配的对象,找到会返回第一个找到的位置的索引
- IndexOf(T,Int32)
a) 传入你要匹配的对象,找到会返回第一个找到的位置的索引,第二个参数是从集合的第几个位置开始匹配。
- Index(T,Int32,Int32)
a) 传入你要匹配的对象,找到会返回第一个找到的位置的索引
b) 第一个Int32传入的是List<T>中的开始位置从零开始。
c) 第二个是把Int32是要搜索多少个项。
- MemberwiseClone
a) 返回当前list的对象的浅表副本。
就是浅复制:将当前对象的的非静态自断复制到该新对象,值类型则对这个字段逐位复制,如果是引用类型,则赋值引用但不赋值引用的对象。原始对象和副本引用同一对象。
可以粗略的理解为CopyTo类似
- Remove
a) 从集合中删除指定对象的第一个匹配项。
- RemoveAll
a) 传入一个委托匹配你想要删除的项,当前这个项返回的是true则会删除当前项。
并且最后集合返回了总共删除了多少个项。
b) 例子
i. static bool Comp(string str)
{
if (str.Equals("a"))
{
return true;
}
else
{
return false;
}
}
List<string> list1 = new List<string>();
list1.Add("a");
list1.Add("k");
list1.Add("k");
list1.Add("a");
list1.Add("a");
int index = list1.RemoveAll(Comp);
Console.WriteLine(index);
foreach (string item in list1)
{
Console.WriteLine(item);
}
//输出了index为3,剩下list1集合里显示只有两个k。
- RemoveAt
a) 删除指定的索引项 传入索引。
- RemoveRange
a) 传入两个索引RemoveRange(3,6),就是在移除list集合中下标为3开始到下标为6的所有数。
- Reverse
a) 把集合反过来,倒序
b) 例子
i. A
B
C
Reverse();
//倒序之后
C
B
A
- Reverse(Int32,Int32)
a) 指定一格范围倒序。 传入两个数Reverse(2,4),表示从这个集合中下标为3开始到下标为6的所有数反转 倒序。
b) 例子
i. A
B
C
D
E
F
Reverse(2,4);
//倒序之后
ii. A
B
E
D
C
F
- Sort
a) 使用比较器排序
b) 例子
i. B
C
A
Sort()
A
B
C
- Sort(Comparison<T>)
a) 传入一个方法 返回 int,两个形参,和集合类型一致,在方法里写自己的排序判断。
- Sort(IComparer<T>)
a) 传入实现了IComparer<T>接口的类。如果为空则用默认的比较器。
- Sort(Int32,Int32,IComparer<T>)
a) 第一个Int32是集合开始的位置
b) 第二个Int32是要排序的范围位置。
c) 第三个传入实现了IComparer<T>接口的类。如果为空则用默认的比较器。
- ToArry
a) 转化成数组给一个数组接收,数组类型和集合一致
- ToString
a) 把当前对象转成字符串
- TrimExcess
a) 可以清除掉list集合中没有被占用的空项。
- TrueForAll
a) 传入一个方法,可以写自己的判断语句,返回布尔值,如果全部都是true
这个方法就会返回一个true否则有一个为false则返回false;
- 扩展一个EndsWith
a) 确定这个字符串的结尾是不是和指定的匹配。
b) 例子
i. String str=”aaaaL”;
str.EndsWith(“L”);
//返回true否则就是false
文章可能有点乱请谅解。。第一次发。另外我只写了方法,对于这些如果有不对的请指出,谢谢。
另外写写我写完的心得。
其实当我一开始写这个,我觉得了解类不就是很简单的事情吗,然后那一晚上,我写了一句话,逐手开始以List<T>为例子写的时候,我发现其实想着简单,要处理的细节是很多的,在写了一句话之后我又总结了一部分自己的看法。写了几个方法。
第二天晚上,我仅仅描述了10来个方法,但是我在想这些都是谁写的我保证不打死他。
第三天晚上,我发现其实在慢慢用自己的理解来了解的时候自己慢慢的理解能力提高了很多,对读懂别人的代码也提升不少,所以第三天晚上我把List<T>里面的方法都写了出来,比前两天加起来的速度快了两倍,这个让我很惊讶,因为当我打开MSDN库的时候看看剩下多少方法我都快绝望了,之后发现其实,没有想象中那么惨反而我很快的写了出来。
所以我总结出,一件小的事情可能包含的细节有很多,但你知道这些细节,你可能比别人知道的更多,不要不去在意这些细节,细节决定成败。
坚持下来研究一样东西,到最后你成功了,或者你理解了大概的意思,但是给你带来的不止是这些你理解出来的东西,更多的是一些不同的成长这些是别人教不了的。所以写这些算是对自己的能力的提高。来传智学的其实不算多吧,三个半月学这些,其实是让你提高学习能力,真正工作大部分都要你自己重新学习了解,这时候你的学习能力就很重要,学的快这是你的优势。
其实我也仅仅是想传达一种思想,对于List<T>中的方法多少是还有别的用法,但是目前我的理解是这么多欢迎补充,还有扩展方法好多的

浙公网安备 33010602011771号