标签:
未引入扩展方法之前的状态
#region 10-1为流提供附加功能的一个简单的工具类 public static class StreamUtil { const int BufferSize = 8192; public static void Copy(Stream input, Stream output) { byte[] buffer = new byte[BufferSize]; int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0)// 读入缓冲区中的总字节数。 如果当前可用的字节数没有请求的字节数那么多,则总字节数可能小于请求的字节数,或者如果已到达流的末尾,则为零 (0)。 { output.Write(buffer, 0, read); } } public static byte[] ReadFully(Stream input) { using (MemoryStream tempStream = new MemoryStream()) { Copy(input, tempStream);//复制流 return tempStream.ToArray();//将流的内容写入字节数组 } } } #endregion #region 10-2用StreamUtil将Web响应流复制到一个文件 WebRequest request = WebRequest.Create("http://www.baidu.com");//为指定的 URI 方案初始化新的 System.Net.WebRequest 实例。 using (WebResponse response = request.GetResponse())//当在子类中被重写时,返回对 Internet 请求的响应。 using (Stream responseStream = response.GetResponseStream())// 当在子类中重写时,从 Internet 资源返回数据流。 using (FileStream output = File.Create("response.txt"))//在指定路径中创建或覆盖文件。 { StreamUtil.Copy(responseStream, output);//StreamUtil负责循环,每次都向响应流索取更多的数据,只至接受到所有数据 } #endregion#region 10-3包含扩展方法的StreamUtil类 public static class StreamUtil { const int BufferSize = 8192; public static void CopyTo(this Stream input, Stream output) { byte[] buffer = new byte[BufferSize]; int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { output.Write(buffer, 0, read); } } public static byte[] ReadFully(this Stream input) { using (MemoryStream tempStream = new MemoryStream()) { CopyTo(input, tempStream); return tempStream.ToArray(); } } } #endregion #region 10-4用扩展方法复制一个流(.NET4.0一下使用扩展方法) WebRequest request = WebRequest.Create("http://www.baidu.com");//为指定的 URI 方案初始化新的 System.Net.WebRequest 实例。 using (WebResponse response = request.GetResponse())//当在子类中被重写时,返回对 Internet 请求的响应。 using (Stream responseStream = response.GetResponseStream())// 当在子类中重写时,从 Internet 资源返回数据流。 using (FileStream output = File.Create("response.txt"))//在指定路径中创建或覆盖文件。 { responseStream.CopyTo(output);//编译器将重载合适的方法,其中包括扩展方法,这里使用Stream.CopyTo,而不是使用StreamUtil。如果存在适当的实例方法,实例方法将优先于扩展方法使用,但编译器不会告知存在一个与现有实力方法匹配的扩展方法 } #endregion #region 10-5在空引用上调用方法 public static class NullUtil { public static bool IsNull(this object x) { return x == null; } #endregion #region 10-5 object y = null; Console.WriteLine(y.IsNull());//如果IsNull是一个普通实例方法,抛出一个异常 y = new object(); Console.WriteLine(y.IsNull()); #endregion #region 10-6用Enumerable.Range打印数字0-9 var collection = Enumerable.Range(0, 10);//延迟执行 foreach (var element in collection) { Console.WriteLine(element); } #endregion #region 10-7用Reverse方法来反转一个集合 var collection = Enumerable.Range(0, 10).Reverse();//一个可枚举实例返回另一个可枚举实例的编程模式 foreach (var element in collection) { Console.WriteLine(element); } #endregion #region 10-8用Lambda表达式作为where方法的参数,从而只保留奇数 ////如果Reverse和where不是扩展方法,代码需要如下编写 //var collection = Enumerable.Range(0, 10); //collection = collection.Where(x => x % 2 != 0); //collection = collection.Reverse(); ////Enumerable和Queryable中出现扩展方法的原因:LINQ针对数据处理进行了专门的调整,将各个单独的操作链接成一条管道,然后让信息在管道中传输 var collection = Enumerable.Range(0, 10).Where(x => x % 2 != 0).Reverse();//返回相同的引用(用于易变类型) foreach (var element in collection) { Console.WriteLine(element); } StringBuilder builder = new StringBuilder(); builder.Append("<123>"); builder = builder.Replace("<", "1").Replace(">", "2");//返回新实例(用于不易变类型) #endregion #region 10-9用Reverse方法来反转一个集合 var collection = Enumerable.Range(0, 10).Where(x => x % 2 != 0).Reverse().Select(x => new { Original = x, SquareRoot = Math.Sqrt(x) }); foreach (var element in collection) { Console.WriteLine("Sqrt({0})={1}", element.Original, element.SquareRoot); } #endregion#region 10-10根据两个属性对序列进行排序 var collection = Enumerable.Range(-5, 11).Select(x => new { Original = x, Square = x * x }).OrderBy(x => x.Square).ThenBy(x => x.Original);//排序不会改变原有的集合,它返回的是新的序列 foreach (var element in collection) { Console.WriteLine(element); } #endregion
标签:
原文地址:http://www.cnblogs.com/Tan-sir/p/5169220.html