xml地图|网站地图|网站标签 [设为首页] [加入收藏]
你能熟练使用Dictionary字典和List列表吗,python基础
分类:编程

之前看过Dapper(使用到了Emit), CYQ.Data(另一种思路,没有使用Emit)类的框架之后, 也想自己做一个小框架玩一下, 不过此时能力太过欠缺, 做不了Cyq.Data或者PDF.Net此类的框架, 所以开始了学习之路. 先制定一个能达到的小目标吧, 从Emit开始. 

1.注释

 

可能很多人还不知道Emit是个什么鬼, 但是听说过EmitMapper的肯定有不少, Emit的概念, 我这里就不多说了, 可以看一下别人的博文(下面的链接里面就有)

单行:# 
多行:三个'单引号'或三个"双引号"

  命名空间System.Collections.Generic中有两个非常重要,而且常用的泛型集合类,它们分别是Dictionary<TKey,TValue>字典和List<T>列表。Dictionary字典通常用于保存键/值对的数据,而List列表通中用于保存可通过索引访问的对象的强类型列表。下面来总结一下,用代码来演示怎么初始化,增加,修改,删除和遍历元素。

一、使用场景

'''

Dictionary<TKey,TValue>字典

  代码如下:

图片 1

namespace DictionaryDemo1
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建Dictionary<TKey,TValue>对象
            Dictionary<string, string> openWith = new Dictionary<string, string>();

            //添加元素到对象中,共有两种方法。注意,字典中的键不可以重复,但值可以重复。
            //方法一:使用对象的Add()方法
            openWith.Add("txt", "notepad.exe");
            openWith.Add("bmp", "paint.exe");
            openWith.Add("dib", "paint.exe");
            openWith.Add("rtf", "wordpad.exe");

            //方法二:使用索引器Indexer
            //openWith["txt"] = "notepad.exe";
            //openWith["bmp"] = "paint.exe";
            //openWith["dib"] = "paint.exe";
            //openWith["rtf"] = "wordpad.exe";

            //增加元素,注意增加前必须检查要增加的键是否存在使用ContainsKey()方法
            if (!openWith.ContainsKey("ht"))
            {
                openWith.Add("ht", "hypertrm.exe");//或openWith["ht"] = "hypertrm.exe";
                Console.WriteLine("增加元素成功!Key={0},Value={1}","ht",openWith["ht"]);
            }

            //删除元素,使用Remove()方法
            if (openWith.ContainsKey("rtf"))
            {
                openWith.Remove("rtf");
                Console.WriteLine("删除元素成功!键为rtf");
            }

            if (!openWith.ContainsKey("rtf"))
            {
                Console.WriteLine("Key="rtf"的元素找不到!");
            }

            //修改元素,使用索引器
            if (openWith.ContainsKey("txt"))
            {
                openWith["txt"] = "notepadUpdate.exe";
                Console.WriteLine("修改元素成功!Key={0},Value={1}", "txt", openWith["txt"]);
            }

            //遍历元素,因为该类实现了IEnumerable接口,所以可以使用foreach语句,注意元素类型是 KeyValuePair(Of TKey, TValue)
            foreach (KeyValuePair<string, string> kvp in openWith)
            {
                Console.WriteLine("Key={0},Value={1}",kvp.Key,kvp.Value);
            }

            Console.WriteLine("遍历元素完成!");
            Console.ReadKey();
        }
    }
}

图片 2

  程序输出结果:

图片 3

回到顶部

Emit的使用场景了,通常我们在下面几种情形时可以选择使用Emit来实现: 

print("hello world") 

List<T>列表

  代码如下:

图片 4

namespace ListDemo1
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建List<T>列表对象
            List<string> dinosaurs = new List<string>();

            //增加元素到列表(或称为初始化),注意初始化时不能使用索引器,因为没有增加元素之前list列表是空的
            dinosaurs.Add("Tyrannosaurus");
            dinosaurs.Add("Amargasaurus");
            dinosaurs.Add("Mamenchisaurus");
            dinosaurs.Add("Deinonychus");
            dinosaurs.Add("Compsognathus");

            //一个重要属性
            Console.WriteLine("列表中的元素数为: {0}", dinosaurs.Count);//获取 List 中实际包含的元素数


            //插入元素,使用Insert()方法
            dinosaurs.Insert(2, "Compsognathus");//将元素插入到指定索引处,原来此位置的元素后移
            Console.WriteLine("在索引为2的位置插入了元素{0}",dinosaurs[2]);

            //删除元素,使用Remove()方法
            dinosaurs.Remove("Compsognathus");//从 List 中移除特定对象的第一个匹配项
            Console.WriteLine("删除第一个名为Compsognathus的元素!");

            //修改元素,使用索引器
            dinosaurs[0] = "TyrannosaurusUpdate";
            Console.WriteLine("修改索引为0的元素成功!");

            //遍历元素,使用foreach语句,元素类型为string
            foreach (string dinosaur in dinosaurs)
            {
                Console.WriteLine(dinosaur);
            }

            Console.WriteLine("遍历元素完成!");
            Console.ReadKey();
        }
    }
}

图片 5

  程序输出结果:

图片 6

 

来源:

     1.  运行中动态的创建类型、模块等,同时又需要提高效率(可以动态编译一次,然后就不用再处理了).

'''

     2 .延迟绑定对象的使用。

     3 . 工具插件及IDE的开发等。 

"""

     4.   ORM的实现。

print("hello world") 

     5.   减少反射的性能损失。

"""

二、小示例

2.编码

以下部分转载自 :  (若侵权, 请与我联系, 删除此部分内容)

python2 = assic =  不支持中文

static void Main(string[] args)
        {
            //1.构建程序集
            var asmName = new AssemblyName("Test");
            var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);

            //2.创建模块
            var mdlBldr = asmBuilder.DefineDynamicModule("Elvinle", "Elvinle.exe");

            //3.定义类
            var typeBldr = mdlBldr.DefineType("Hello", TypeAttributes.Public);

            //4.定义类成员(方法,属性等等)
            //public void SayHello(){}
            var methodBldr = typeBldr.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, null, null);

            //5.构建方法体
            //获取il生成器 
            var il = methodBldr.GetILGenerator();
            il.Emit(OpCodes.Ldstr, "Hello, HelloWorld!");
            il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
            il.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
            il.Emit(OpCodes.Pop);//读入的值会被推送至evaluation stack,而本方法是没有返回值的,因此,需要将栈上的值抛弃 
            il.Emit(OpCodes.Ret);

            //调用CreateType来完成类型的创建
            var t = typeBldr.CreateType();
            //设置入口点为SayHello(), -- 相当于Main()
            asmBuilder.SetEntryPoint(t.GetMethod("SayHello"));
            asmBuilder.Save("Elvinle.exe");
        }

文件中有中文,不管是否为注释,python2执行报错。 

结果如下:

解决:程序首行加 #coding=utf-8 或 #*-* coding:utf-8 *-*

本文由澳门新葡亰手机版发布于编程,转载请注明出处:你能熟练使用Dictionary字典和List列表吗,python基础

上一篇:没有了 下一篇:Django学习目录,常用指令介绍
猜你喜欢
热门排行
精彩图文