zoukankan      html  css  js  c++  java
  • 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 = {1}",item.Key,item.Value);
            }
        }
    }

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

  • 相关阅读:
    spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常
    在zepplin 使用spark sql 查询mongodb的数据
    Unable to query from Mongodb from Zeppelin using spark
    spark 与zepplin 版本兼容
    kafka 新旧消费者的区别
    kafka 新生产者发送消息流程
    spark ui acl 不生效的问题分析
    python中if __name__ == '__main__': 的解析
    深入C++的new
    NSSplitView
  • 原文地址:https://www.cnblogs.com/zwt-blog/p/6344751.html
Copyright © 2011-2022 走看看