私はいくつかのコードを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);
}
});
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
。呼び出しポイントより上で定義されたローカル変数、または呼び出しを行う関数を囲むクラスのメンバー変数/プロパティにすることができます。
public class Outer { private class Inner { } }
- Daniel HilgarthInner
C#では常に静的です。つまり、暗黙的に参照されていません。Outer
。参照は、内部クラスのフィールドを介して明示的に指定する必要があります。実際、非静的内部クラスおよび匿名クラスにおけるJavaの暗黙の参照は、多くの場合、Javaコードのメモリリークの原因となります。 - Brianprivate class Inner
C#では、と同じです。private static class Inner
Javaで。いずれにせよ、まだ良い答えです。 - BrianOuter
内部のインスタンスInner
オブジェクトを参照し、参照をOuter
の中にInner
のコンストラクタです。 - dasblinkenlight
C#では、場合によってはインタフェースの代わりにデリゲートを使用することになります。特に、このように呼び出し元がメソッドをインラインで定義したい場合は特にそうです。ラムダを使用して、デリゲートが期待される場所にインラインで匿名メソッドを定義できます。
List<String> list = new List<String> { "B", "D", "E" };
list.Sort((a, b) => a.CompareTo(b));
C#でのJavaの匿名インターフェースの実装に相当するものはないので、必要なインターフェースがある場合(これはList
それを実装するには名前付きクラスを作成する必要があります。
C#は、匿名インターフェイスの実装の代わりにデリゲートの概念を使用しています。
交換したと仮定ArrayList<DATA>
ネットでList<DATA>
:
IEnumerable<DATA> sorted =
queue1.OrderBy(q => distanceFunction.calculate(q, promoted.first));
c#にList of Dataオブジェクトがあるとします。
queue1.OrderBy(a => distanceFunction.Calculate(a, promoted.First));
List.Sort
リスト自体を変更する。 - Servy
元の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);
}
}