与C#中的匿名接口实现相对应
我正在努力将一些代码从Java转换为C#,但是遇到了一些麻烦,也许有人可以提供帮助吗?
我在尝试复制Java中广泛使用的匿名接口实现时遇到问题,但不知道如何使用。
一个例子是:
List queue1 = new ArrayList(dataSet); // Sort by distance to the first promoted data Collections.sort(queue1, new Comparator() { @Override public int compare(DATA data1, DATA data2) { double distance1 = distanceFunction.calculate(data1, promoted.first); double distance2 = distanceFunction.calculate(data2, promoted.first); return Double.compare(distance1, distance2); } });
我在尝试复制Java中广泛使用的内联函数时遇到问题
这些不是内联函数,即实现特定接口的匿名类。
C#为代理提供了内联或单独函数的定义。
以下是使用Comparison
委托对List
进行排序的示例:
List queue = new List(); queue.Sort( (left, right) => { double distance1 = distanceFunction.Calculate(left, promoted.first); double distance2 = distanceFunction.Calculate(right, promoted.first); return Double.Compare(distance1, distance2); } );
请注意,为了使其起作用, distanceFunction
变量需要位于您调用queue.Sort
。 它可以是在调用点上方定义的局部变量,也可以是包含调用函数的类的成员变量/属性。
在C#中,你可能最终使用委托而不是接口,特别是在这样的情况下,调用者可能想要内联定义方法。 您可以使用lambda来定义内联的匿名方法,其中包含任何委托。
List list = new List { "B", "D", "E" }; list.Sort((a, b) => a.CompareTo(b));
在C#中没有等同于Java的匿名接口实现,因此如果需要一个接口(排序List
不是这种情况),则需要创建一个命名类来实现它。
C#使用委托的概念代替匿名接口实现。
假设您已使用.Net List
替换了ArrayList
List
:
IEnumerable sorted = queue1.OrderBy(q => distanceFunction.calculate(q, promoted.first));
假设您在c#中有一个Data对象列表:
queue1.OrderBy(a => distanceFunction.Calculate(a, promoted.First));
如果你想要与原始Java相似的东西,那么:
internal virtual void test() { List queue1 = new List (dataSet); queue1.Sort(new ComparatorAnonymousInnerClassHelper()); } private class ComparatorAnonymousInnerClassHelper : IComparer { public virtual int compare(int data1, int data2) { double distance1 = distanceFunction.calculate(data1, promoted.first); double distance2 = distanceFunction.calculate(data2, promoted.first); return distance1.CompareTo(distance2); } }