【问题标题】:How to convert this C# scripts to Javascript如何将此 C# 脚本转换为 Javascript
【发布时间】:2016-12-26 13:10:47
【问题描述】:

我有一个如下所示的 C# 脚本:

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);
        }
    }
}

我想将其转换为 javascript,如下所示

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);
        }
    }
}

这里的_ 符号是lodash 符号。

在我转换成 javascript 代码后,这些函数的行为与 C# 不同。对于相同的 vertices 数据,paths 数组返回的大小不同。 感谢您的阅读,如果您在这里看到我的错误,请帮助我。

【问题讨论】:

  • “行为不同”并不能真正告诉我们问题所在。
  • 提到确切的错误信息,你得到了!
  • 转换成javascript代码后,这些函数的行为与C#的不同。对于相同的vertices 数据,paths 数组返回的大小不同。
  • 一个出错的例子会有帮助

标签: javascript c# code-conversion


【解决方案1】:

在 C# 版本中,您的 VisitCell 函数有一个条件为 if(ver2 != parent),但在 JS 版本中,您检查它们是 equal 而不是 not equal

此外,该条件永远不会通过任何方式,因为在您第一次调用该函数时,您为父级传递了 null,但在这种情况下,您检查父级是否“真实”。

Lodash 的isEqual 可以处理空值,所以我不确定你为什么要检查父级是否真实。也许你是打算这样做的?

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

【讨论】:

  • 是的,你是对的,谢谢。我的愚蠢错误是检查 parentVertex。对于_.isEqual,这是我在stackoverflow上编辑问题中的代码时的错误。
【解决方案2】:

有几种方法可以改进您的 JavaScript 代码。转译代码时,最好不要复制/粘贴和修复​​,而是使用目标语言重写。

我更喜欢这样写,例如:

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);
        }
    }
}

请记住,变量 verticesentrancePosexitPosPath 在您的 C# 代码中对我不可用,因此我只在 JavaScript 上声明它们。尽可能实现它们。

顺便说一句,这能解决问题吗?

【讨论】:

  • 感谢您的代码。我认为您的代码在结构上非常好。我在第一次转换脚本时已经测试过这个,但是整个项目在很多方面都使用了这个函数,我不知道但是使用remainingVertices.shift()时结果仍然是错误的。我投票赞成您的答案,但由于我的声誉很低,因此不能公开查看。再次感谢您。
  • 正如您的 OP 中所要求的,我们需要一些结果示例来了解代码为何或如何不同。只是看着它,在我看来结果应该是相等的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2012-09-18
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多