与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); } } 
Interesting Posts