C#相当于Lambda

时间:2013-12-31 03:17:59

标签: c# lambda

我正在尝试将一些JS转换为C#,我得到了这篇文章,但是无法弄清楚C#的等价物是什么。希望有人可以指出我正确的方向?

我只需要帮助这两个功能的内容。 $ iterator在另一个地方编码,但我猜测以下代码的C#版本不需要它。如果你需要我添加它,我可以。

调用这些函数的上下文是:

var centers = Lambda.array(Lambda.map(this.hexes,function(hex) {
            return me.hexToCenter(hex);
        }));

功能是:

var Lambda = function() { }
Lambda.array = function(it) {
    var a = new Array();
    var $it0 = $iterator(it)();
    while( $it0.hasNext() ) {
        var i = $it0.next();
        a.push(i);
    }
    return a;
}
Lambda.map = function(it,f) {
    var l = new List();
    var $it0 = $iterator(it)();
    while( $it0.hasNext() ) {
        var x = $it0.next();
        l.add(f(x));
    }
    return l;
}

3 个答案:

答案 0 :(得分:6)

您并不真正需要自己的maparray方法。已有相同的功能,您只需在文件顶部添加using System.Linq;即可使用Select,这是一种投影方法,ToArray从您的集合中创建了一个数组。它们都是IEnumerable<T>上设置的扩展方法,因此您几乎可以在任何集合中使用它们。

var centers = hexes.Select(x => me.hexToCenter(x)).ToArray();

等同于您的JavaScript代码:

var centers = Lambda.array(Lambda.map(this.hexes,function(hex) {
            return me.hexToCenter(hex);
        }));

答案 1 :(得分:2)

这看起来像一个相当简单的C#lambda:

var centers = this.hexes.Select(hex => me.hexToCenter(hex)).ToList();
LINQ提供了

SelectToList扩展方法 - 您需要添加using System.Linq才能使用它们。

答案 2 :(得分:1)

您可能希望在此处使用LINQ路线。

您的map相当于LINQ的Select,例如

var centers = this.hexes.Select(hex => me.hexToCenter(hex)).ToArray();

表达式hex => me.hexToCenter(hex)是C#中的lambda表达式,Select用于将this.hexes投影到所需的表单中。

ToArray()相当于您的Lambda.array来电。

对于使用LINQ的例子,

101 LINQ Samples in C#是一个很好的资源。

注意 101个样本中的大多数使用查询语法,而不是我上面使用的功能语法。对于简单的情况,它们大致相同,但是对于来自JS背景的功能性语法感到满意应该不是问题。