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#には、インラインまたは別の関数で定義できるデリゲートが用意されています。

デリゲートList<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# では、多くの場合、インターフェイスの代わりにデリゲートを使用することになります。特に、呼び出し元がメソッドをインラインで定義する可能性が高いこのような場合です。ラムダを使用して、デリゲートが期待されるインラインで匿名メソッドを定義できます。

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

元の 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 に答える
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 に答える