(5)不断深入的C#

这节课学到了应用很广泛的正则表达式,它在C#中同样起到了很好的通配作用,下面来看个例子。

我们先创造了一个正则实例,然后用它处理了一个字符串,AppendFormt是处理复合格式字符串的方法,返回的字符串追加到此实例。

这是一个匹配的字符串,并且返回字符串长度。体现了正则表达式的基本作用。查了些资料,了解了正则表达式的一些相关知识:

在C#中new一个Regex对象的时候,第二个参数能够用枚举支持选择匹配模式,现在就来说说这些枚举值对正则的影响。

   模式              说明

   .SingleLine           点号能够匹配任何字符
   .Multiline            扩展^和$的匹配,使^和$能够匹配字符串内部的换行符
   .IgnorePatternWhitespace   设计宽松排列和注释模式
   .IgnoreCase          进行不区分大小写的匹配
    .ECMAScript          限制\w \s \d,令其只对ASCII字符有效
   .RightToLeft          传动装置的驱动过程不变,但是方向相反(从字符的末尾开始,向开头移动)
   .Compiled           多花些时间优化正则表达式,编译到dll里,占用多点内存,但是匹配更快。
   .ExplicitCapture        普通括号()在正常情况下是捕获型括号,但是在此模式下与(?:...)一样,之分组,不捕获

Regex有两种方法Match(),Matches()其中Match()方法中有个Groups能包含所有Match找到的Group。

string string1 = "04:03:27 127.0.0.0 LibertyAssociates.com " +
      "04:03:28 127.0.0.0 foo.com " +  “04:03:29 127.0.0.0 bar.com ";
  // group time = one or more digits or colons followed by space
  // group ip address = one or more digits or dots followed by space
  // group site = one or more characters,  \S:any none space characters
   Regex theReg = new Regex(@"(?<time>(\d|\:)+)\s"
             [email protected]"(?<ip>(\d|\.)+)\s" + @"(?<site>\S+)");
   // get the collection of matches
   MatchCollection theMatches = theReg.Matches(string1);
    foreach (Match theMatch in theMatches)
   {// iterate through the collection
        if (theMatch.Length != 0)
       {
          Console.WriteLine("\ntheMatch: {0}", theMatch.ToString());
          Console.WriteLine("time: {0}“, theMatch.Groups["time"]);
          Console.WriteLine("ip: {0}“, theMatch.Groups["ip"]);
          Console.WriteLine("site: {0}“, theMatch.Groups["site"]);
        }
    }

用这种方法可以将字符串的各个部分划归出来,解决了有时需要同时导入多个信息的问题。

接下来让我们探讨下运用windows 异步API的问题,这里我们要用到两个关键字:async ,await

public async Task<int> ExampleMethodAsync()
{
   var httpClient = new HttpClient();
   int exampleInt = (await
                   httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;

ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
   return exampleInt;
}
这里使用的await关键字,代表调用异步接口并等待返回结果后才执行后面的代码。这个函数在定义时用了一个关键字:async,这是因为在此函数中至少有一个地方用了await关键字,那么这个函数就必须定义为async。在外面调用这个函数的时候也就可以用await关键字了,例如:

bool result = await ExampleMethodAsync();

同样的,上面这行代码所在的函数,也必须声明async关键字。其实调用异步API的时候,也可以不用写这两个关键字,但是代码的执行顺序会发生变化,返回结果类型也变了。

今天还要跟大家介绍一点关于数据类型转换的东西:int.parse(),int.Tryparse()和Convert.ToInt32().它们的作用相似,却有着很大的差别。Convert.ToInt32 适合将object类类型转换成int类型,如Convert.ToInt32(session["shuzi"]);  int.Parse适合将string类类型转换成int类型,如int.Parse(session["shuzi"].ToString()),

int.TryParse(input, out i)

第一个参数为要转化的值,第二个参数为输出值,如果转换失败,输出值为 0,如果转换成功,输出值为转换后的int值

关于int.TryParse(input, out i),该表达式转换成功返回 true,转换失败返回 false。

针对于浮点型的取舍问题,浮点型只有Convert.ToInt32()和(int)能进行转换,但是也是进行取舍了 的,Convert.ToInt32()采取的取舍是进行四舍五入,而(int)则是截取浮点型的整数部分,忽略小数部分,例如 Convert.ToInt32(1.499d)和(int)1.499d都返回1,Convert.ToInt32(1.5d)返回2,而 (int)1.5d还是返回1;

Convert.ToInt32(double value) 如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5转换为4,4.5 转换为 4,而 5.5 转换为 6。  不过4.6可以转换为5,4.4转换为4

一点小小的学习心得,有嘛错误请大家指正。。

时间: 2024-10-13 16:24:59