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 #에 데이터 목록 개체가 있다고 가정합니다.
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);
}
}