集合
1. IList 接⼝与List的区别是什么?
IList 泛型接⼝是 Icollection 接⼝的⼦代,并且是所有⾮泛型列表的基接⼝。 Ilist 实现有三种类别:只 读、固定⼤⼩、可变⼤⼩。 ⽆法修改只读 Ilist。 固定⼤⼩的 Ilist 不允许添加或移除元素,但允许修改 现有元素。 可变⼤⼩的 Ilist 允许添加、移除和修改元素。
IList 是个接⼝,定义了⼀些操作⽅法这些⽅法要你⾃⼰去实现,当你只想使⽤接⼝的⽅法时,这种⽅式⽐ 较好.他不获取实现这个接⼝的类的其他⽅法和字段,有效的节省空间。
List 是个类型 已经实现了IList 定义的那些⽅法。
List List11 =new List ();
是想创建⼀个List,⽽且需要使⽤到List的功能,进⾏相关操作。 ⽽只是想创建⼀个基于接⼝IList的对象的实例,只是这个接⼝是由List实现的。所以它只是希望使⽤到 IList接⼝规定的功能⽽已。
IList IList11 =new List ();
2.泛型的主要约束和次要约束是什么?
当⼀个泛型参数没有任何约束时,它可以进⾏的操作和运算是⾮常有限的,因为不能对实参进⾏任何类 型上的保证,这时候就需要⽤到泛型约束。
泛型的约束分为:主要约束和次要约束,它们都使实参必须 满⾜⼀定的规范,C#编译器在编译的过程中可以根据约束来检查所有泛型类型的实参并确保其满⾜约束条件。
(1)主要约束 ⼀个泛型参数⾄多拥有⼀个主要约束,主要约束可以是⼀个引⽤类型、class或者struct。如果指定⼀个 引⽤类型(class),那么实参必须是该类型或者该类型的派⽣类型。相反,struct则规定了实参必须是 ⼀个值类型。下⾯的代码展示了泛型参数主要约束:
public class ClassT1<T> where T : Exception
{private T myException;public ClassT1(T t)
{myException = t;}public override string ToString()
{// 主要约束保证了myException拥有source成员return myException.Source;}
}
public class ClassT2<T> where T : class
{private T myT;public void Clear()
{// T是引⽤类型,可以置nullmyT = null;}
}
public class ClassT3<T> where T : struct
{private T myT;public override string ToString()
{// T是值类型,不会发⽣NullReferenceException异常return myT.ToString();}
(2)次要约束 次要约束主要是指实参实现的接⼝的限定。对于⼀个泛型,可以有0到⽆限的次要约束,次要约束规定 了实参必须实现所有的次要约束中规定的接⼝。次要约束与主要约束的语法基本⼀致,区别仅在于提供 的不是⼀个引⽤类型⽽是⼀个或多个接⼝。例如我们为上⾯代码中的ClassT3增加⼀个次要约束:
public class ClassT3<T> where T : struct, IComparable
{......
}
3. 如何把⼀个array复制到arrayist⾥?
foreach( object arr in array)
{arrayist.Add(arr);
}
4.List, Set, Map是否继承⾃Collection接⼝?
List,Set是,Map不是。
5. Set⾥的元素是不能重复的,那么⽤什么⽅法来区分重复与否呢? 是⽤==还是equals()? 它们有 何区别?
Set⾥的元素是不能重复的,那么⽤iterator()⽅法来区分重复与否。equals()是判读两个Set是否相等。 equals()和==⽅法决定引⽤值是否指向同⼀对像,equals()在类中被覆盖,为的是当两个分离的对象的 内容和类型相配的话,返回真值。
6.有50万个int类型的数字,现在需要判断⼀下⾥⾯是否存在重复的数字,请你简要说⼀下思路。
- 1.使⽤C#的List集合⾃带的去重⽅法,例如 Distinct(),GroupBy()等
- 2.利⽤ Dictionary 的Key值唯⼀的特性,HashSet 元素值唯⼀的特性 进⾏判断
7.数组有没有length()这个⽅法? String有没有length()这个⽅法?
数组没有length()这个⽅法,有length的属性。String有有length()这个⽅ 法。
8.⼀个整数List中取出最⼤数(找最⼤值)。不能⽤Max⽅法。
private static int GetMax(List<int> list){int max = list[0];for (int i = 0; i < list.Count; i++){if (list[i]>max){max = list[i];}}return max;}
9. C#异常类有哪些信息?
C#中,所有异常都继承⾃System.Exception类,Exception类定义了C#异常应该具有的信息和⽅法。 值得注意的属性有:
public virtual string Message { get; }// 错误的信息,⽂字描述
public virtual string StackTrace { get; }// 发⽣异常的调⽤堆栈信息
public System.Reflection.MethodBase TargetSite { get; }//引发这个错误的⽅法
public Exception InnerException { get; }// ⼦异常
10. 如何创建⼀个⾃定义异常?
根据类继承原则和异常处理原则,我们可以使⽤以下⽅式来⾃定义⼀个类:
public class CustomException : Exception
{
}
11. 利⽤IEnumerable实现斐波那契数列⽣成?
IEnumerable<int> GenerateFibonacci(int n)
{if (n >= 1) yield return 1;int a = 1, b = 0;for (i