【问题标题】:Typescript how to combine two lambda expressionsTypescript如何组合两个lambda表达式
【发布时间】:2015-11-11 20:13:00
【问题描述】:

如何用 Typescript 组合两个 lambda 表达式,

C# 确实有类 Expression-Func 可以处理 lambda 表达式,但 Typescript 没有这个选项。

我有一个函数可以将 lambda 表达式传递给名为 GetCurrentRange 的函数

例如this.GetCurrentRange(start, end, x => x.AccountId== Account.id)

和其他函数在其上添加表达式。

result = result.And(x => x.Date >= CurrentStart);

我如何使用 Typescript 做到这一点,

这里有更多细节

在此处编辑

private GetCurrentRange(start?: Date, end?: Date, activeSpec: (exception: AccountTransaction) => boolean)
    {
        var result = activeSpec;
       /// some code here

       result = result (need to add exception here )(x => x.Date >= currentStart);  

    }
}
return result;

}

public Update(_account: Account, start?: Date, end?: Date): void
{  // some code here 
var transactions = Query(this.GetCurrentRange(start, end, x => x.AccountId == _account.id)); }

【问题讨论】:

  • 我不确定我是否完全理解这个问题,你能举一个更完整的例子吗?

标签: lambda typescript


【解决方案1】:

我喜欢这个问题......这是一个完整的例子,然后是一个简单的解释:

class Example {
    constructor(
        public num: number,
        public bool: boolean
    ) {}
}

var examples: Example[] = [
    new Example(5, true),
    new Example(5, false),
    new Example(6, true),
];

function exampleFilter(arr: Example[], predicate: (x: Example) => boolean) {
    var matches: Example[] = [];
    for (var i = 0; i < arr.length; i++) {
        if (predicate(arr[i])) {
            matches.push(arr[i]);
        }
    }
    return matches;
}


function exampleFilter2(arr: Example[], predicate: (x: Example) => boolean) {

    var newPredicate = function(x: Example) {
        return x.bool && predicate(x);
    }

    var matches: Example[] = [];
    for (var i = 0; i < arr.length; i++) {
        if (newPredicate(arr[i])) {
            matches.push(arr[i]);
        }
    }
    return matches;
}

var a = exampleFilter(examples, (x) => x.num < 6);
console.log(a);

var b = exampleFilter2(examples, (x) => x.num < 6);
console.log(b);

所以exampleFilterexampleFilter2 的区别在于谓词的扩展,这样做是这样的:

var newPredicate = function(x: Example) {
    return x.bool && predicate(x);
}

因此,您可以采用这种技术来制作您在问题中描述的可精炼物品。

查询类

这是一个类的基本示例,它将充当 T 类型数组的通用查询。

class Query<T> {

    constructor(private arr: T[], private predicate: (x:T) => boolean) {}

    and(predicate: (x:T) => boolean) {
        var priorCondition = this.predicate;
        this.predicate = (x:T) => {
            return priorCondition(x) && predicate(x);
        }
        return this;
    }

    toList() {
        var matches: T[] = [];
        for (var i = 0; i < this.arr.length; i++) {
            if (this.predicate(this.arr[i])) {
                matches.push(this.arr[i]);
            }
        }
        return matches;
    }
}

and 方法只是合并它传递的每个谓词。

var q = new Query(examples,  (x) => x.num < 6);
q.and((x) => x.bool);

var result = q.toList();

甚至:

var result = new Query(examples,  (x) => x.num < 6).and((x) => x.bool).toList();

注意

当心我在这个区域见过几次的一个错误......我们现在有一个 API,它看起来有点像 Linq,行为有点像 Linq - 但您需要使用 ECMAScript 6 generators if you want to actually work like Linq

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多