2

我正在将一些代码从 Java 转换为 C#,但遇到了一些麻烦,也许有人可以帮忙?

我在尝试复制 Java 中广泛使用的匿名接口实现时遇到问题,但不知道如何去做。

一个例子是:

List<DATA> queue1 = new ArrayList<DATA>(dataSet);
            // Sort by distance to the first promoted data
            Collections.sort(queue1, new Comparator<DATA>() {
                @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);
                }
            });
4

5 回答 5

5

我在尝试复制 Java 中广泛使用的内联函数时遇到问题

这些不是内联函数,而是实现特定接口的匿名类。

C# 提供了可以内联或在单独函数中定义的委托。

下面是使用委托对 aList<DATA>进行就地排序的示例:Comparison<T>

List<DATA> queue = new List<DATA>();
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。它可以是在调用点之上定义的局部变量,也可以是包含进行调用的函数的类的成员变量/属性。

于 2012-12-10T16:23:17.483 回答
1

在 C# 中,您最终会在可能的情况下使用委托而不是接口,尤其是在这种情况下,调用者可能希望内联定义方法。您可以使用 lambda 在需要任何委托的地方内联定义匿名方法。

List<String> list = new List<String> { "B", "D", "E" };

list.Sort((a, b) => a.CompareTo(b));

在 C# 中没有等效于 Java 的匿名接口实现,因此如果需要接口(排序 a 不是这种情况List),您将需要创建一个命名类来实现它。

于 2012-12-10T16:24:04.213 回答
0

C# 使用委托的概念代替匿名接口实现。

假设您已替换ArrayList<DATA>为 .Net List<DATA>

IEnumerable<DATA> sorted =
    queue1.OrderBy(q => distanceFunction.calculate(q, promoted.first));
于 2012-12-10T16:21:48.810 回答
0

假设您在 c# 中有一个数据对象列表:

queue1.OrderBy(a => distanceFunction.Calculate(a, promoted.First));
于 2012-12-10T16:22:25.567 回答
0

如果您想要与原始 Java 类似的东西,那么:

internal virtual void test()
{
    List<int> queue1 = new List<int>(dataSet);
    queue1.Sort(new ComparatorAnonymousInnerClassHelper());
}

private class ComparatorAnonymousInnerClassHelper : IComparer<int>
{
    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);
    }
}
于 2012-12-10T21:53:34.187 回答