首页 > 代码库 > C#学习笔记11

C#学习笔记11

1.List.BinarySearch():BinarySearch()采用的是二分搜索算法,要求元素已经排好序,其特点是假如元素没有找到,会返回一个负整数,该值的按位取反(~)结果是“大于被查找元素的下一个元素”的索引,如果没有更大的值,则是元素的总数。这样一来就可以在列表中的特定位置方便地插入新值,同时保持已排序的状态。可查看CollecationData.TestBinarySearch()代码。要注意的是,假如事先没有排好序,那么不一定能找到一个元素,即是它确实在列表中。

2.Dictionary<TKey,TValue>的赋值:其赋值有2种方式,

(1)使用Add()方法添加键值对元素,但是若添加了一个相同的键值,会引发一个异常。

(2)使用索引器赋值,如dictionary[key]=value,若没有该键值则进行添加,若有该键值则进行覆盖。

3.字典类是没有特定的顺序,元素使用散列码存到一个散列表中,这样可以实现快速检索。所以如果使用foreach循环来遍历一个字典类,将不按照特定的顺序来访问值。

4.已排序的集合类:SortedDictionary<TKey,TValue>和SortedList<T>,对SortedDictionary<TKey,TValue>元素是按照键排序的,对SortedList<T>元素是按照值排序的。在一个已排序的集合中插入或删除元素时,由于要保持集合中的元素顺序,所以相对前面描述的普通集合,执行时间要稍长一些。可查看CollecationData.TestSortedDictionary()代码。

5.栈集合类Stack<T>:其元素是先进后出,三个关键的方法是Push()、Pop()、Peek(),

(1)Push()将元素送入集合,元素不必是唯一的;

(2)Pop()按照与添加时相反的顺序获取并删除元素;

(3)Peek()返回Pop()将获取的下一个元素,但不修改栈中元素。

6.列队集合Queue<T>:其元素遵循先入先出(元素不必是唯一的),使用Enqueue()进行入队与Dequeue()进行出队(出队会移除元素),相当于一个管子的两端。列队集合根据需要自动增大,当不再需要数据的时候,我们使用TrimToSize()方法来恢复以前的容量。

7.索引运算符:使用this[参数]进行声明,内中含有get与set,索引运算符可以获取多个参数,甚至可以重载。C#编译器为索引运算符创建的CIL代码是一个名为Item的特殊属性索引器在CIL代码中的属性名称默认为Item,但是可以使用IndexerName(标记属性)来指定一个不同的名称,当然在实际使用中并无区别,它是它为不直接支持索引器的语言指定了名称。编译器能检查到这个特性,但是IndexerName标记属性本身是不会在CIL输出中出现的,所以不能通过反射来使用它。

8.迭代器(yield)是如何工作的:C#编译器遇到一个迭代器时,会根据枚举数模式将代码展开成恰当的CIL,在生成的代码中,C#编译器首先创建一个嵌套的private类来实现IEnumerator<T>接口,以及它的Current属性和一个MoveNext()方法,Current属性返回与迭代器的返回类型对应的一个类型。

9.单个类创建多个迭代器(yield):有时候可能希望不同的迭代顺序、比如逆向迭代、对结果进行筛选等,为了在类中声明额外的迭代器,你可以把它们封装到返回IEnumerable<T>或IEnumrable的属性或方法中。

10.yield语句的特征:只有在返回IEnumerator<T>或者IEnumerable<T>类型的成员中,才能声明yield return 语句。更具体地说,只有在返回IEnumerator<T>的GetEnumerator()方法中,或者在返回IEnumerable<T>但不叫做GetEnumerator()的方法中,才能声明yield return。

public class CollecationData
{
    public static void TestBinarySearch()
    {
        List<string> list = new List<string>() { "public", "protected", "private" };
        string item = "protected internal";
        list.Sort();
        int index = list.BinarySearch(item);
        if (index < 0)
        {
            list.Insert(~index, item);
        }
        list.ForEach(Console.WriteLine);
    }

    public static void TestSortedDictionary()
    {
        SortedDictionary<string, string> sortDict = new SortedDictionary<string, string>();
        int index = 0;
        sortDict.Add(index++.ToString(), "object");
        sortDict.Add(index++.ToString(), "byte");
        sortDict.Add(index++.ToString(), "uint");
        sortDict.Add(index++.ToString(), "ulong");
        sortDict.Add(index++.ToString(), "float");
        sortDict.Add(index++.ToString(), "char");
        sortDict.Add(index++.ToString(), "bool");
        sortDict.Add(index++.ToString(), "ushort");
        sortDict.Add(index++.ToString(), "decimal");
        sortDict.Add(index++.ToString(), "int");
        sortDict.Add(index++.ToString(), "sbyte");
        sortDict.Add(index++.ToString(), "short");
        sortDict.Add(index++.ToString(), "long");
        sortDict.Add(index++.ToString(), "void");
        sortDict.Add(index++.ToString(), "double");
        sortDict.Add(index++.ToString(), "string");
        Console.WriteLine("key  value   Hashcode");
        Console.WriteLine("---  -----   --------");
        foreach (KeyValuePair<string, string> item in sortDict)
        {
            Console.WriteLine("{0,-5}{1,-9}{2}", item.Key, item.Value, item.Key.GetHashCode());
        }
    }

    public static void TestDict()
    {
        Dictionary<string, string> dict = new Dictionary<string, string>();
        dict["1"] = "";
        dict.Add("2", "");
        foreach (var item in dict)
        {
            Console.WriteLine("key = {0} , value = http://www.mamicode.com/{1}",item.Key,item.Value);
        }
    }
}

-------------------以上内容根据《C#本质论 第三版》进行整理

C#学习笔记11