随笔分类 - 委托和linq
delegate
摘要:引子 delegate:代表,授权,翻译为“委托”,即用对象代表方法成员或对象被授权执行方法成员。看下面一小段代码: int Max(int x,int y){ return x>y?x:y;}int Min(int x,int y){ return x SpeakEnglish(msg); delSample3("KoalaStudio"); Console.ReadKey(); } private void SpeakChinese(string msg) { Console.W...
阅读全文
摘要:假如有以下XML:- - - D:\888\- - \韩寒_要自由.htm 民主 - \谈谈韩寒三论.htm 民主\中国 - \韩寒_我的2011.htm 民主\中国 - \韩寒_要自由.htm 民主\中国 -...
阅读全文
摘要:1 泛型委托 Predicate 早在Framework 2.0 的时候,微软就为 List 类添加了 Find、FindAll 、ForEach 等方法用作数据的查找。 public T Find ( Predicate match) public List FindAll(Predicate match) 在这些方法中存在一个Predicate 表达式,它是一个返回bool的泛型委托,能接受一个任意类型的对象作为参数。 public delegate bool Predicate(T obj) 在下面例子中,Predicate 委托绑定了参数为Person类的方法Match作...
阅读全文
摘要:1 事件的由来 在介绍事件之前大家可以先看看下面的例子, PriceManager 负责对商品价格进行处理,当委托对象 GetPriceHandler 的返回值大于100元,按8.8折计算,低于100元按原价计算。 1 public delegate double PriceHandler(); 2 3 public class PriceManager 4 { 5 public PriceHandler GetPriceHandler; 6 7 //委托处理,当价格高于100元按8.8折计算,其他按原价计算 8 p...
阅读全文
摘要:在 Framework 2.0 出现之前,委托协变这个概念还没有出现。此时因为委托是安全类型,它们不遵守继承的基础规则。即会这下面的情况:Manager 虽然是 Worker 的子类,但 GetWorkerHander 委托不能直接绑定 GetManager 方法,因为在委托当中它们的返回值 Manager 与 Worker 被视为完全无关的两个类型。 1 public class Worker 2 {.......} 3 public class Manager:Worker 4 {.......} 5 6 class Progra...
阅读全文
摘要:linq表达式的标准形式为from...where...select,其中from后面跟的就是范围变量。linq中范围变量需要是泛型的集合,假如我们想对ArrayList或Object[]进行处理,linq就无能为力了。解决这种弱类型集合问题可以用两种方法:Cast和OfType。下面用一个实例进行演示。 ArrayList list = new ArrayList { "First", "Second", "third" }; IEnumerable strings=list.Cast(); foreach (string item
阅读全文
摘要:当Lambda表达式和LINQ一起使用时,我们会发现原本冗长的代码会变得如此简单。比如我们要打印0-10之间的奇数,让其从高到低排列并求其平方根,现在只用一行代码即可完成其集合的生成,直接上代码: 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} =
阅读全文
摘要:匿名方法允许我们指定一个内联委托的操作,为创建委托实例表达式的一部分。其可以对代码进行极度精简,当然可读性变得很差。下面看一个求平方根的例子。 List list = new List();list.Add(4);list.Add(5);list.Add(15);list.Add(20);list.Add(49);list.ForEach(delegate(int x) { Console.WriteLine(Math.Sqrt(x)); }); 乍眼一看,会发现其没有什么可读性。若既想精简,又要保持可读性怎么办呢,我们可以取一个折中的办法,即不再坚持“大括号单独占一行”的规则,但...
阅读全文
摘要:通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做。使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收。尤其是假如某“短命”的对象调用了一个“长命”的对象中的事件,并用其自身作为目标。“长命”对象间接容纳了对“短命”对象的引用,延长了“短命”对象的寿命。下面是一个只为委托而委托的例子:delegate void StringProgressor(string input); //声明委托类型 class Person { string name; public Person(string name) { t...
阅读全文
摘要:假如有以下xml文件 首先引用Xml.Linq命名空间,然后用以下方法进行读取XDocument doc = XDocument.Load("XMLFile1.xml"); var filtered = from p in doc.Descendants("Product") join s in doc.Descendants("Supplier") on (int)p.Attribute("SupplierID") equals (int)s.Attribute("SupplierID") o
阅读全文
摘要:前两天公司进了一批书,在借阅jon skeet的c# in deep收获颇大,本书特点是介绍了不同版本的c#所增加的新特性。今天先写一下书中对linq的描述。 很多初学者在使用VS2010或2013写代码时都会看见软件会自动帮我们引用linq这个命名空间,而不知其作用。linq全称为language integrated query,即语言集成查询,是c#3的核心所在,可使对多数据源的查询变得简单。 比如一段代码有一个Products类,其包含Name和Price两个属性。我们现在需要在原基础上增加一个suppliers类,其包含Name和SupplierID两个属性,这样需要在Produc.
阅读全文