2016-12-26 1 views
-2

ich ein C# Skript wie unten haben:Wie dieses C# Skripte Javascript konvertieren

public List<MazePath> BreakIntoConnectedPaths() 
{ 
    List<MazeVertex> remainVertices = new List<MazeVertex>(vertices); 
    List<MazePath> paths = new List<MazePath>(); 
    while (remainVertices.Count > 0) 
    { 
     MazePath path = new MazePath(); 
     path.entrancePosition = entrancePosition; 
     path.exitPosition = exitPosition; 
     VisitCell(path, remainVertices.First(), null, remainVertices); 
     paths.Add(path); 
     //Store the coordinate for entrance and exit 
    } 
    return paths; 
} 

void VisitCell(MazePath path, MazeVertex ver, MazeVertex parent, List<MazeVertex> remainVertices) 
{ 
    remainVertices.Remove(ver); 
    path.Add(ver); 
    for (int i = 0; i < ver.connectVertices.Count; i++) 
    { 
     MazeVertex ver2 = ver.connectVertices[i]; 
     if (ver2 != parent) 
     { 
      VisitCell(path, ver2, ver, remainVertices); 
     } 
    } 
} 

will ich es wie unten

BreakIntoConnectedPaths = function() { 
    var remainVertices = _.cloneDeep(this.vertices); 
    var paths = []; 

    while (remainVertices.length > 0) { 
     var path = new Path(); 
     path.entrancePos = this.entrancePos; 
     path.exitPos = this.exitPos; 
     this.VisitCell(path, remainVertices[0], null, remainVertices); 
     paths.push(path); 
     // Store the coordinate for entrance and exit 
    } 
    return paths; 
} 

VisitCell = function(path, vertex, parentVertex, remainVertices) { 
    _.remove(remainVertices, function(v) { 
     return v.x === vertex.x && v.z === vertex.z; 
    }); 
    path.Add(vertex); 
    for (var i = 0; i < vertex.connectVertices.length; i++) { 
     var connectedVertex = vertex.connectVertices[i]; 
     // if (parentVertex && (connectedVertex.x !== parentVertex.x || connectedVertex.z !== parentVertex.z)) { 
     if(parentVertex && _.isEqual(connectedVertex, parentVertex)) { 
      VisitCell(path, connectedVertex, vertex, remainVertices); 
     } 
    } 
} 

Das _ Symbol hier ist lodash Zeichen Javascript konvertieren.

Nachdem ich Javascript-Code konvertiert habe, ist das Verhalten dieser Funktionen mit C# ein Unterschied. Mit den gleichen vertices Daten war das paths Array mit der Differenzgröße zurückgekommen. Vielen Dank für das Lesen und bitte helfen Sie mir, wenn Sie meinen Fehler hier sehen.

+1

"Das Verhalten ist anders" sagt uns nicht viel über das Problem. – David

+1

Erwähnen Sie die genaue Fehlermeldung, die Sie bekommen! – Vikrant

+0

Nachdem ich Javascript-Code konvertiert habe, ist das Verhalten dieser Funktionen anders als bei C# one. Mit den gleichen "Vertices" -Daten war das "Paths" -Array mit der Differenzgröße zurückgekehrt. – ChickenSoups

Antwort

0

In der C# -Version hat Ihre VisitCell Funktion eine Bedingung, die if(ver2 != parent), aber in der JS-Version sagt, dass Sie prüfen, ob sie gleich statt nicht gleich sind.

Auch diese Bedingung würde niemals vergehen, weil Sie in Ihrem ersten Aufruf an diese Funktion in null für das übergeordnete Element übergeben, aber in diesem Zustand überprüfen Sie, ob das übergeordnete "truthy" ist.

Lodashs isEqual kann mit Nullwerten umgehen, deshalb bin ich nicht sicher, warum Sie überprüfen, ob der Elternteil dort truthy ist. Vielleicht wollten Sie das tun?

if(!_.isEqual(connectedVertex, parentVertex)) { 
+0

Ja, du hast Recht, danke. Mein blöder Fehler ist, dass parentVertex überprüfen. Für die _.isEqual ist das mein Fehler beim Bearbeiten des Codes in der Frage auf stackoverflow. – ChickenSoups

0

Es gibt mehrere Möglichkeiten, Ihren JavaScript-Code zu verbessern. Wenn Code transpiliert wird, ist es besser, nicht zu kopieren/einfügen und zu korrigieren, sondern stattdessen die Zielsprache neu zu schreiben.

Ich würde es vorziehen, das geschrieben zu haben, zum Beispiel:

var vertices; 
var entrancePos; 
var exitPos; 

function Path(entrancePos, exitPos){ 
    this.entrancePos = entrancePos; 
    this.exitPos = exitPos; 

    this.Add = function() { 
     // your Add() code here 
    } 
} 

function breakIntoConnectedPaths() { 
    var remainingVertices = _.cloneDeep(vertices); 
    var paths = []; 

    while (remainVertices.length) { 
     var path = new Path(entrancePos, exitPos); 
     visitCell(path, remainingVertices.shift()); 

     // Store the coordinate for entrance and exit 
     paths.push(path); 
    } 

    return paths; 
} 

function visitCell(path, vertex, parentVertex) { 
    path.Add(vertex); 

    for (var i = 0; i < vertex.connectVertices.length; i++) { 
     var connectedVertex = vertex.connectVertices[i]; 
     if(_.isEqual(connectedVertex, parentVertex)) { 
      visitCell(path, connectedVertex, vertex); 
     } 
    } 
} 

Beachten Sie, dass die Variablen vertices, entrancePos, exitPos und Path mir auf Ihrem C# -Code nicht verfügbar sind, so dass ich sie nur erklären auf JavaScript. Implementieren Sie sie wie Sie mögen.

Wird das übrigens repariert?

+0

Vielen Dank für Ihren Code. Ich denke, dass dein Code in der Struktur sehr nett ist. Ich habe das getestet, als ich das Skript zum ersten Mal konvertiert habe, aber das ganze Projekt benutzt diese Funktion in vielerlei Hinsicht, ich weiß es nicht, aber das Ergebnis ist immer noch falsch, wenn residualVertices.shift() verwendet wird. Ich habe deine Antwort gewählt, aber sie kann nicht öffentlich sein, weil mein Ruf sehr gering ist. Danke nochmal. – ChickenSoups

+0

Wie in Ihrem OP gefordert, benötigen wir einige Ergebnisbeispiele, um zu wissen, warum oder wie sich die Codes unterscheiden. Betrachtet man es, scheint mir das Ergebnis gleich zu sein – rabelloo

Verwandte Themen