当前位置: 首页 > news >正文

龙华区城市建设局网站网站策划书一般包括以下内容

龙华区城市建设局网站,网站策划书一般包括以下内容,建设银行黑龙江省分行官方网站,什么网站流量高01、集合基础知识 .Net 中提供了一系列的管理对象集合的类型#xff0c;数组、可变列表、字典等。从类型安全上集合分为两类#xff0c;泛型集合 和 非泛型集合#xff0c;传统的非泛型集合存储为Object#xff0c;需要类型转。而泛型集合提供了更好的性能、编译时类型安全…01、集合基础知识 .Net 中提供了一系列的管理对象集合的类型数组、可变列表、字典等。从类型安全上集合分为两类泛型集合 和 非泛型集合传统的非泛型集合存储为Object需要类型转。而泛型集合提供了更好的性能、编译时类型安全推荐使用。 .Net中集合主要集中在下面几个命名空间中 1.1、集合的起源接口关系 天赋技能 —— foreach几乎所有集合都可以用foreach循环操作是因为他们都继承自IEnumerable接口由枚举器IEnumerator提供枚举操作。 几乎所有集合都提供添加、删除、计数来自基础接口 ICollection、ICollectionT。 IList、IListT 提供了数组的索引器、查找、插入等操作几乎所有具体的集合类型都实现了该接口。 Array 是一个抽象类是所有数组T[]的基类她是类型安全的。 推荐尽量使用数组T[]、泛型版的集合提供了更好的类型安全和性能。 1.2、非泛型集合—— 还有什么存在的价值 非泛型的HashtableKey、Value都是Object类型的Dictionary 是泛型版本的 Hashtable。 ArrayList 是非泛型版本的 ListT基本很少使用也尽量不用。 ❓既然非泛型版本类型不安全性能还差为什么还存在呢 主要是历史原因泛型是.Net2.0 引入的因此为了向后兼容依然保留的非泛型版本集合。在接口实现时非泛型接口一般都是显示实现的因此基本不会用到。不过在有些场景下非泛型接口、集合还是有点用的如类型不固定的集合或者用接口作为约束条件或类型判断。 ArrayList arr new ArrayList(); arr.Add(1); arr.Add(sam); arr.Add(new Point()); if (arr is IList) {}class UserT where T :IList {} 1.3、CollectionT、ListT有何不同 ❓两者比较相似他们到底有什么区别呢该如何选择 CollectionT 作为自定义集合基类内部提供了一些virtual的实现便于继承实现自己的集合类型。其内部集合用的就是ListT如下部分源码 Collection.cs。 ListT 作为集合使用是最常用的可变长集合类型了他优化了性能但是丢失了可扩展性没有提供任何可以override的成员。 public class CollectionT {public Collection(){items new ListT();}protected virtual void InsertItem(int index, T item){items.Insert(index, item);} } 02、枚举器——foreach的秘密 foreach 用来循环迭代可枚举对象用一种非常简洁、优雅的姿势访问可枚举元素。常用于数组、集合当然不仅限于集合只要符合要求枚举要求的都可以。 2.1、IEnumerator枚举器 枚举可以foreach 枚举的密码是他们都继承自IEnumerable接口而更重要的是其内部的枚举器 —— IEnumerator。枚举器IEnumerator定义了向前遍历集合元素的基本协议其申明如下 public interface IEnumerator {object Current { get; }bool MoveNext();void Reset(); //这个方法是非必须的用于重置游标可不实现 } public interface IEnumeratorout T : IDisposable, IEnumerator {new T Current { get; } } MoveNext() 移动当前元素到下一个位置Current获取当前元素如果没有元素了则MoveNext()返回false。注意MoveNext()会先调用因此首次MoveNext()是把位置移动到第一个位置。 Reset()用于重置到起点主要用于COM互操作使用很少可不用实现直接抛出 NotSupportedException。 该接口不是必须的只要实现了公共的Current、无参MoveNext()成员就可进行枚举操作。 实现一个获取偶数的枚举器 void Main() {var evenor new EvenNumbersEnumerator(1, 10);while (evenor.MoveNext()){Console.WriteLine(evenor.Current); //2 4 6 8 10} } //获取偶数的枚举器 public struct EvenNumbersEnumerator : IEnumeratorint //不继承IEnumerator接口效果也是一样的 {private int _start;private int _end;private int _position int.MinValue;public EvenNumbersEnumerator(int start, int end){_start start;_end end;}public int Current _position;object IEnumerator.Current Current; //显示实现非泛型接口然后隐藏起来public bool MoveNext(){if (_position int.MinValue)_position (int.IsEvenInteger(_start) ? _start : _start 1) - 2;_position 2;return (_position _end);}public void Reset() throw new NotSupportedException();public void Dispose() { } //IEnumerator 是实现了 IDisposable接口的 } 2.2、IEnumerable可枚举集合 IEnumerable、IEnumerableT是所有集合的基础接口其核心方法就是 GetEnumerator() 获取一个枚举器。 public interface IEnumerable {IEnumerator GetEnumerator(); } public interface IEnumerableout T : IEnumerable {new IEnumeratorT GetEnumerator(); } 该接口也不是必须的只要包含public的“GetEnumerator()”方法也是一样的。 有了 GetEnumerator()就可以使用foreach来枚举元素了这里foreach会被编译为 while (evenor.MoveNext()){} 形式的代码。在上面 偶数枚举器的基础上实现 一个偶数类型。 void Main() {var evenNumber new EvenNumbers();foreach (var n in evenNumber){Console.WriteLine(n); //2 4 6 8 10} } public class EvenNumbers : IEnumerableint //不用必须继承接口只要有GetEnumerator()即可 {public IEnumeratorint GetEnumerator(){return new EvenNumbersEnumerator(1, 10);}IEnumerator IEnumerable.GetEnumerator() //显示实现非泛型接口然后隐藏起来{return GetEnumerator();} } foreach 迭代其实就是调用其GetEnumerator()、Current、MoveNext()实现的因此接口并不是必须的只要有对应的成员即可。 foreach (var n in evenNumber) {Console.WriteLine(n); //2 4 6 8 10 } /************** 上面代码编译后的效果如下*****************/ IEnumeratorint enumerator evenNumber.GetEnumerator(); try {while (enumerator.MoveNext ()){int i enumerator.Current;Console.WriteLine (i);} } finally {if (enumerator ! null){enumerator.Dispose ();} } 2.3、yield 迭代器 yield return 是一个用于实现迭代器的专用语句它允许你一次返回一个元素而不是一次性返回整个集合。常来用来实现自定义的简单迭代器非常方便无需实现IEnumerator接口。 惰性执行元素是按需生成的这可以提高性能并减少内存占用当然这个要看具体情况特别是在处理大型集合或复杂的计算时。迭代器方法在被调用时不会立即执行而是在MoveNext()时才会执行对应yield return的语句并返回该语句的结果。Linq里的很多操作也是惰性的。 简化代码使用yield return可以避免手动编写迭代器的繁琐过程。 状态保持yield return自动处理状态保持使得在每次迭代中保存当前状态变得非常简单。每一条yield return语句执行完后代码的控制权会交还给调用者由调用者控制继续。 yield迭代器方法会被会被编译为一个实现了IEnumerator 接口的私有类可以看做是一个高级的语法糖有一些限制要求 迭代器的返回类型可以是IEnumerable、IEnumerator或他们的泛型版本。还可以用 IAsyncEnumerableT 来实现异步的迭代器。 yield break 语句提前退出迭代器不可直接用return是非法的。 yield语句不能和try...catch一起使用。 void Main() {var us new User();foreach (string name in us){Console.WriteLine(name); //sam kwong}foreach (string name in us.GetEnumerator1()){Console.WriteLine(name); //1 sam 2}foreach (string name in us.GetEnumerator2()){Console.WriteLine(name);//KWONG} } public class User {private string firstName sam;private string lastName Kwong;public IEnumerator GetEnumerator(){yield return firstName;yield return lastName;}public IEnumerable GetEnumerator1() //返回IEnumerable{Console.WriteLine(1);yield return firstName; //第一次执行到这里Console.WriteLine(2);yield break; //第二次执行到这里也是最后一次了yield return lastName;}public IEnumerablestring GetEnumerator2() //返回IEnumerablestring{yield return lastName.ToUpper();} } 03、集合装逼了 3.1、⭐常用集合类型 ArrayList arr2 new ArrayList(); arr2.Add(null); arr2.Add(sam); arr2.Add(1); Console.WriteLine(arr2[1]); 3.2、⭐数组Array[] Array 数组是一种有序的集合通过唯一索引编号进行访问。数组T[]是最常用的数据集合了几乎支持创建任意类型的数组。Array是所有的数组T[]的隐式基类包括一维、多维数组。CLR会将数组隐式转换为 Array 的子类生成一个伪类型。 索引从0开始。 定长数组在申明时必须指定长度超出长度访问会抛出IndexOutOfRangeException异常。 内存连续为了高效访问数组元素在内存中总是连续存储的。如果是值类型数组值和数组是存储在一起的如果是引用类型数组则数组值存储其引用对象的堆内存地址。因此数组的访问是非常高效的 多维数组矩阵数组 用逗号隔开int[,] arr {{1,2},{3,4}}; 多维数组锯齿形数组数组的数组int[][] arr new int[3][]; int[] arr new int[100]; //申请长度100的int数组 int[] arr2 new int[]{1,2,3}; //申请并赋值长度为3 int[] arr3 {1,2,3}; //同上前面已制定类型后面可省略 arr[1] 1; Console.WriteLine(arr[2]); //未赋值默认为0 几乎大部分编程语言的数组索引都是从0开始的如C、Java、Python、JavaScript等。当然也有从1开始的如MATLAB、R、Lua。 通过上表发现Array 的很多方法都是静态方法而不是实例方法这一点有点困惑造成了使用不便。而且大部分方法都可以用Linq的扩展来代替。 3.3、Linq扩展 LINQ to Objects (C#) 提供了大量的对集合操作的扩展可以使用 LINQ 来查询任何可枚举的集合IEnumerable。扩展实现主要集中在 代码 Enumerable 类源码 Enumerable.cs涵盖了查询、排序、分组、统计等各种功能非常强大。 简洁、易读可以链式操作简单的代码即可实现丰富的筛选、排序和分组功能。 延迟执行只有在ToList、ToArray时才会正式执行和yeild一样的效果。 var arr Enumerable.Range(1, 100).ToArray(); //生成一个数组 var evens arr.Where(n int.IsEvenInteger(n)); //并没有执行 var arr2 arr.GroupBy(n n % 10).ToArray(); 04、集合的一些小技巧 4.1、集合初始化器{} 同类的初始化器类似用{}来初始化设置集合值支持数组、字典。 //数组 int[] arr1 new int[3] { 1, 2, 3 }; int[] arr2 new int[] { 1, 2, 3 }; int[] arr4 { 1, 2, 3 }; //字典 Dictionaryint, string dict1 new() { { 1, sam }, { 2, william } }; Dictionaryint, string dict2 new() { [5] sam, [6] zhangsan }; //索引器写法 var dict3 new Dictionaryint, string { { 1, sam }, { 2, william } }; 4.2、集合表达式[] 集合表达式 简化了集合的申明和赋值直接用[]赋值比初始化器更简洁语法形式和JavaScript差不多了。可用于数组、Sapn、List还可以自定义集合生成器。 int[] iarr1 new int[] { 1, 2, 3, 4 }; //完整的申明方式 int[] iarr2 { 1, 2, 3, 4 }; //前面声明有类型int[]可省略new int[] iarr3 [1, 2, 3, 4]; //简化版的集合表达式Liststring list [a1, b1, c1]; Spanchar sc [a, b, c]; HashSetstring set [a2, b2, c2];//..展开运算符把集合中的元素展开 Liststring list2 [.. list,..set, ccc]; //a1 b1 c1 a2 b2 c2 ccc 4.3、范围运算符.. a..b表示a到b的范围不含b其本质是 System.Range 类型数据表示一个索引范围常用与集合操作。 可省略a或b缺省则表示到边界。 可结合倒数^使用。 int[] arr new[] { 0, 1, 2, 3, 4, 5 }; Console.WriteLine(arr[1..3]); //1 2 //索引1、2 Console.WriteLine(arr[3..]); //3 4 5 //索引3到结尾 Console.WriteLine(arr[..]); //全部 Console.WriteLine(arr[^2..]); //4 5 //倒数到2到结尾var r 1..3; Console.WriteLine(r.GetType()); //System.Range 自定义的索引器也可用用范围Range作为范围参数。 05、提高集合性能的一些实践 尽量给集合一个合适的“容量” capacity几乎所有可变长集合的“动态变长”其实都是有代价的。他们内部会有一个定长的“数组”当添加元素较多大于容量时就会自动扩容如倍增然后把原有“数组”数据拷贝搬运到新“数组“中。 因此在使用可变长集合时尽量给一个合适的大小可减少频繁扩容带来的性能影响。当然也不可盲目设置一个比较大的容量这就很浪费内存空间了。stringBuilder也是一样的道理。 可变长集合的插入、删除效率都不高因为会移动其后续元素。 下面测试一下ListT当创建一个长度为1000的List时设置容量1000和不设置容量默认4的对比。 int max 10000; public void List_AutoLength(){Listint arr new Listint();for (int i 0; i max; i){arr.Add(i);} } public void List_FixedLength() { Listint arr new Listint(max);for (int i 0; i max; i){arr.Add(i);} } 很明显自动长度的List速度更慢也消耗了更多的内存。 尽量不创建新数组使用一些数组方法时需要注意尽量不要创建新的数组如下面示例代码 var arr Enumerable.Range(1, 100).ToArray(); // 需求对arr进行反序操作 var arr2 arr.Reverse().ToArray(); //用Linq创建了新数组 Array.Reverse(arr); //使用Array的静态方法原地反序没有创建新对象 比较一下上面两种反序的性能 文章转载自安木夕 原文链接https://www.cnblogs.com/anding/p/18229596 体验地址引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构
http://www.w-s-a.com/news/553842/

相关文章:

  • 同性做视频网站网站怎么添加栏目
  • 新余网站设计seo自学网站
  • 新乡个人网站建设价格wordpress数据插件
  • 你是网站设计有限公司的项目经理网站推广的重要性
  • 网站定制开发怎么写泸州设计公司有哪些
  • 上海网站建设zj kt迅速编程做网站
  • 郑州服装 网站建设网站栏目合理性
  • 平面设计在线网站最新汽油价格调整最新消息
  • 刷单网站建设wordpress缩略图 裁剪
  • 视差 网站泰州公司做网站
  • 广州网站优化系统怎么做淘客网站
  • 类似凡科互动的网站wordpress网站下载
  • 临沂网站制作公司安卓app开发实例教程
  • 泰州做网站 泰公网络科技公司网站升级中html
  • 如何做授权网站网站设计心得
  • 网站排名快速上升wordpress自动标签页
  • 做的好的手机网站有哪些万网域名交易
  • 网站怎么做漂亮点做陶瓷的公司网站
  • 软件开发设计制作网站下载自己怎么做视频收费网站
  • 江苏省建设安全协会网站天津网站建设哪家公司好
  • 资源类网站怎么做的网站上线准备工作
  • 长沙专业网站建设怎么做企业建站公司服务
  • 肇庆市有限公司网站建设手机直接看的网站有哪些
  • 织梦修改网站后备份英语作文模板高中
  • 个人网站域名用什么好上海公司拍沪牌需要什么条件
  • 网站建设 保密做网站赚钱交税
  • 食品建设网站前的市场分析进出口网站贸易平台有哪些
  • php商城网站建设个人网站用什么服务器
  • 如何做好品牌网站建设方案网站开发的学习
  • 网站开发 管理方案wordpress怎么搭建微博