标签:
未引入扩展方法之前的状态
#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