我正在写一个K-Nearest Neighbors分类器类。我想允许客户端指定要使用的距离函数。
我的KNNClassifier
对象的构造函数可以将方法作为参数吗?在Python中,我这样做如下:
class KNNClassifier:
def __init__(self, examples, membership, n_classes, distance_func):
self.examples = examples
self.membership = membership
self.n_classes = n_classes
self.distance_func = distance_func
self.m = len(self.membership)
self.n = len(self.examples[0])`
可以用C#完成吗?我是C#的新手,一个基本的例子将不胜感激。
答案 0 :(得分:4)
您使用delegates。以下是使用generics的简单示例:
public class MyClass<T>
{
private Func<T, T, int> _distanceFunc
public MyClass(Func<T, T, int> distanceFunc)
{
this._distanceFunc = distanceFunc;
}
}
这声明了一个generic class,MyClass
,它接受一个泛型类型参数T
,并且有一个带有一个参数的构造函数。该参数本身是一个函数,它接受T
类型的两个参数并返回int
。在MyClass
内,_distanceFunc
指向的委托可以用括号调用,就像任何其他函数一样:
T instanceA = ...
T instanceB = ...
int result = this._distanceFunc(instanceA, instanceB);
您甚至可以将其与lambda expressions结合使用,如下所示:
var foo = new MyClass<string>((a, b) => Math.Abs(a.Length - b.Length));
答案 1 :(得分:1)
是的,您可以使用Func
,Action
和delegates
来执行此操作:
行动:http://www.dotnetperls.com/action
Func:http://www.dotnetperls.com/func
委托:http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx