声明扩展方法的步骤:类必须是static,方法是static,第一个参数是被扩展的对象,前面标注this。使用扩展方法的时候必须保证扩展方法类已经在当前代码中using。
  LINQ:将int数组中大于20的元素排序输出:
  int[] values = { 30, 5, 99, 77, 102, 8, 12, 35 };
  var result = from item in values
             where item > 20
        orderby item
        select item;
  取出现次数最多的三个数:
  int[] values = { 1, 2, 5, 2, 3, 5, 5, 3, 4, 3, 3 };
  var result = from item in values
        group item by item into g
        orderby g.Count() descending
        select new {数字=g.Key,次数=g.Count()};
 foreach (var item in result.Take(3))
  {
  Console.WriteLine(item.数字+"="+item.次数);
 }
 和sql语句不同,linq中select放到最后(方便类型推断)。in后是要进行处理的集合,from后的变量是values中每个元素的变量(联想foreach),select后是查询结果,result是select结果变量类型的范型的IEnumerable.

排序,分组:1、orderby item;2、orderby person.Age descending;
  3、var result = from person in persons
  group person by person.Age into g//by 后面指的就是“根据谁分组”
  select new { 年龄 = g.Key, 人数 = g.Count() };//g.Key就是组的年龄
  LINQ常用扩展方法:下面的方法都是IEnumerable<T>的扩展方法:Average计算平均值; Min最小元素;Max最大元素;Sum元素总和; Count元素数量。

 正则表达式:

.:匹配任何单个字符。例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”。 
  [ ] :匹配括号中的任何一个字符。例如正则表达式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字。
  ( ) :将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。
  | :将两个匹配条件进行逻辑“或”运算。'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
  *:匹配0至多个在它之前的子表达式,和通配符*没关系。例如正则表达式“zo*”能匹配 “z” 、“zo”以及 “zoo”;因此“.*”意味着能够匹配任意字符串。"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。
  + :匹配前面的子表达式一次或多次,和*对比(0到多次)。例如正则表达式9+匹配9、99、999等。 “zo+”能匹配 “zo”以及 “zoo” ,不能匹配"z"。
  ? :匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。一般用来匹配“可选部分”。
  {n} :匹配确定的 n 次。"zo{2}"→zoo。例如,“e{2}” 不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e”。
  {n,} :至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配 “seeeeeeeed”中的所有“e”。
  {n,m} :最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。
  ^(shift+6) :匹配一行的开始。例如正则表达式“^regex”能够匹配字符串“regex我会用”的开始,但是不能匹配“我会用regex”。
  ^另外一种意思非!
  $ :匹配行结束符。例如正则表达式“浮云$” 能够匹配字符串“一切都是浮云”的末尾,但是不能匹配字符串“浮云呀”
  \d:代表一个数字,等同于[0-9]
  \D:代表非数字,等同于[^0-9]
  \s:代表换行符、Tab制表符等空白字符
  \S:代表非空白字符
  \w:匹配字母或数字或下划线或汉字,即能组成单词的字符
  \W:非\w ,等同于[^\w]
  d:digital;s:space、w:word。大写就是“非”
  正则表达式(Regular Expression)的主要类:Regex.IsMatch方法用于判断一个字符串是否匹配正则表达式。
  正则表达式还可以用来进行字符串提取
  Match match = Regex.Match("age=30", @"^(. +)=(.+)$");
  if (match.Success)
  {
  Console.WriteLine(match.Groups[1] .Value);
  Console.WriteLine(match.Groups[2] .Value);
  }
  match的Success属性表示是否匹配成功;正则表达式中用()将要提取的内容括起来,然后就可以通过Match的Groups属性来得到所有的提取元素,注意Groups的序号是从1开始的,0有特殊含义
  +、*的匹配默认是贪婪(greedy)的:尽可能多的匹配,直到“再贪婪一点儿”其后的匹配模式就没法匹配为止。
  在+、*后添加?就变成非贪婪模式(? 的另外一个用途):让其后的匹配模式尽早的匹配。修改成"我是(.+?)。"
  正则表达式可以从一段文本中将所有符合匹配的内容都输出出来。Match获得的是匹配的第一个。Regex.Matches方法可以获得所有的匹配项。

 Regex.Replace,将字符串中匹配的内容替换为指定的内容。如果匹配中有group,还可以在替换字符串中用$number来进行引用替换。

垃圾收集GC(Garbage Collection)。内存的分配、回收不需要程序员操心,程序员只要需要的时候new就可以,用完了不用管,有人帮你清除不用的内存。这个人就是“垃圾收集器”。GC优点:程序员不用关心内存的申请和回收,缺点:不用的内存不能立即得到回收(GC并不会实时去回收不用的内存,而是找时机才回收)。
  当对象一定不再有用的时候GC就可以将对象回收了。判断一个对象是否一定不再有用的标准就是没有任何的变量指向它。不会再被使用的内存(对象)就是垃圾。对象可以被回收不一定会立即回收。
  GC只能回收托管(Managed)内存资源,对于数据库连接、文件句柄、Socket连接等这些资源(非托管资源,UnManaged)就无能为例,必须程序员自己控制资源的回收。SqlConnection、FileStream等。
  对于使用非内存资源的类,完全可以自己定义一个销毁资源的方法来供程序员回收,.net推荐实现IDisposable接口(为了规范非托管资源的回收),在Dispose方法中进行回收。实现了IDisposable接口的对象都可以使用using进行资源管理。
  Dispose中通常会顺便调用Close,这只是实现类自己的行为,没人强求, IDisposable中的 Dispose方法根本不知道Close方法的存在,甚至可以没有close方法。没有规定Dispose一定会调用Close方法,但是很多的实现了IDisposable接口的方法中,通常都是代为调用Close之类的方法。一般的close只是关闭,也许关闭后还能打开,但是Dispose一般就表示资源被回收了,再也没法用了。有的类可能没有close方法。
  Close和Dispose的区别:
  1、一个类如果实现IDisposable接口,则肯定有Dispose这个方法。
  但是一个类可以没有Close方法,也可以不叫Close。
  2、即使像SqlConnection、FileStream这种有Close也有Dispose方法的,IDisposable接口也没有约定Dispose必须帮助Close,只不过一般的Dispose的实现都判断是否Close,如果没有Close则帮助Close,但是这是好心、不是义务。
  string是不变的,因此每次运算都会重新创建一个string对象。大量的字符串相连会产生大量的中间字符串,字符串是对象,对象的产生是慢的,而且会占用大量的内存。所以要避免大量的字符串的连接操作。对象的创建是非常慢和消耗资源的,因此对于需要动态拼接字符串的场合(比如创建SQL语句)用StringBuilder来代替string,StringBuilder内部实现了字符串拼接不会有string的缺陷。
  StringBuilder的常用方法:Append:N多重载函数。AppendLine:自动添加回车的Append。Replace:和String中的Replace差不多。ToString()转换为String,卸下重担,很多地方只认string。
  1、因为字符串是不可变的,所以CLR可能会将相同值的字符串用同一个实例。程序中大量使用字符串,有不少是重复性的,为了降低内存占用,.Net将代码中声明的字符串放到字符串拘留池中,值相同的字符串共享同一个实例。字符串是不变的。不是所有字符串都在拘留池中,.Net会判断哪些该放。
  2、object.ReferenceEquals方法判断两个变量是不是一个实例(同一个对象)
  string s1 = "abc";
  string s2 = "abc";
  Console.WriteLine(object.ReferenceEquals(s1,s2));
  3、动态字符串默认是不在字符串拘留池中的
  结构体非常类似于类,但是值类型(拷贝传递),不能被继承。Int32、DateTime等都是结构体,从ValueType继承,值类型。
  浅层拷贝,就是只拷贝类的第一层成员,而且如果成员是引用类型,则引用同一份。深层拷贝,把对象引用的所有直接、间接的对象都拷贝一份。

最新文章

  1. python 选择排序
  2. java各种排序实现
  3. veridata实验举例(6)验证agent启动先后顺序是否对捕获update操作有影响
  4. 45. leetcode 504. Base 7
  5. 七、Spring Boot Servlet 使用
  6. sqlite ef6
  7. 微信开发之SVN提交代码与FTP同步到apache的根目录
  8. [Reinforcement Learning] 强化学习介绍
  9. 取消IDEA默认打开最近的项目(设置打开选择创建页面)
  10. 【PAT】 B1006 换个格式输出整数
  11. jquery 获取$(&quot;#id&quot;).text()里面的值 需要进行去空格去换行符操作
  12. 使用 universalimageloader 缓存图片的配置类及使用方法
  13. shell技巧之以逆序形式打印行
  14. C++命名空间学习笔记
  15. jQuery 2
  16. 【搜索】Fliptile
  17. android LinearLayout添加分隔线
  18. 0004python中的map,reduce,lambda,filter
  19. webpack 项目实践
  20. 【SIKIA计划】_06_Unity2D游戏开发-拾荒者笔记

热门文章

  1. Problem Q: 零起点学算法12——求2个日期之间的天数
  2. FCL研究-集合- System.Collections 接口和对象集合
  3. 使用IDEA创建package
  4. ListView(下)自定义适配器
  5. RowState 介绍
  6. ios 如何获得系统时间和日期
  7. iOS:iOS为什么要用-all_load、-ObjC、-force_load
  8. pkav漏洞之精华部分
  9. 利用github和git命令,将本地项目共享到服务器上
  10. FIS 配置小诀窍