一直以来小猪都没有跨过委托的这个概念的门槛,只能够回答委托就是函数的指针。但是怎么用却并不能够理解。
这也一直困扰着我,最近越发的决定要把他拿下。
现在讲讲我对他的理解。
网上很多例子都讲了他是函数的指针,即把某个方法传递给另外一个方法作为参数来用。一直不理解为什么这样。直到今天想到去年的时候用到一个方法时回头看才发现那会已经用到了。
例子是这样的,我需要一个方法来过滤一个List<>里面相同的元素,“相同的”的这是个模糊的概念,不同类型对“相同的”概念的定义是不同的。
这样在写这么一个过滤类的方法的时候就不能直接的判断List里面的元素是否==了,从而也就不能够删除达到过滤的效果。那这个怎么办呢?
可以给这个方法加上一个参数,这个参数是委托的类型。在定义委托的时候需要给其加上返回bool的标签(相同返回true,不同返回false)。
代码如下:
public delegate bool EqualsComparer<T>(T x, T y); /// <summary> /// 过滤重复数据 /// </summary> public class Comparint<T> : IEqualityComparer<T> { private EqualsComparer<T> ec; public Comparint() { } public Comparint(EqualsComparer<T> e) { this.ec = e; } #region IEqualityComparer<BudgetBE> 成员 public bool Equals(T x, T y) { if (null != this.ec) return this.ec(x, y); else return false; } public int GetHashCode(T obj) { return obj.ToString().GetHashCode(); } #endregion }
这样在使用这个类的比较方法时必须要给这个方法传递一个方法,这个方法用来判断你要比较的类是否相等。(即需要确定是否相等)
下面给出实现的这个方法,很简单,我拿string类型做示例,如果复杂的类需要自己实现返回的true 或者false
public bool bijiao(string a , string b) { return a==b; }
这样再配合通用的类这样来实现
List<string> distinceString = TestList.Distinct(new Comparint<string>(bijiao)).ToList();
代码中的TestList即是含有重复类容的List
这样我们就把bijiao这个方法传递给了Comparint
。
注意:给委托赋值的时候是对其值是没有括号的,有括号的是方法的调用,没括号是方法的地址。