首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq函数/表达式局部求值

Linq函数/表达式局部求值
EN

Stack Overflow用户
提问于 2010-08-06 22:16:30
回答 3查看 2.2K关注 0票数 1

给定以下代码:

代码语言:javascript
复制
        int min = 0;

        Expression<Func<List<IUser>, bool>> ulContainsJohn = 
                    (l => l.Where(u => u.FirstName == "John").Count() > min);

        Assert.AreEqual(true, ulContainsJohn.Compile()(userList));

        min = 3;

        Assert.AreEqual(true, ulContainsJohn.Compile()(userList));

该列表包含1个"John",但第二个断言失败。我如何将min的值绑定到Func,这样它就不会尝试重新计算变量min?

澄清:我不想更改签名。我希望表达式树将min计算为常量表达式,而不是变量。有没有办法转换min的求值,使树有一个常量表达式而不是变量求值?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-06 22:51:52

编辑:阅读您的评论,尝试使用函数创建器。

代码语言:javascript
复制
Func<int, Func<List<IUser>, bool>> createFn = (min) =>
    (l) => (l.Count(u => u.FirstName == "John") > min);

Func<List<IUser>, bool>> contains0 = createFn(0);

Assert.AreEqual(true, contains0(userList));

Func<List<IUser>, bool>> contains3 = createFn(3);

Assert.AreEqual(true, contains3(userList));

尝试使用1元素数组。很难看,但很管用。

代码语言:javascript
复制
var values = new int[] { 0 };

Expression<Func<List<IUser>, bool>> ulContainsJohn = 
                (l => l.Where(u => u.FirstName == "John").Count() > values[0]);

Assert.AreEqual(true, ulContainsJohn.Compile()(userList));

values[0] = 3;

Assert.AreEqual(true, ulContainsJohn.Compile()(userList));

另一种选择,更好:

代码语言:javascript
复制
private int Minimum { get; set; }

...

Expression<Func<List<IUser>, bool>> ulContainsJohn = 
            (l => l.Where(u => u.FirstName == "John").Count() > Minimum);

Func<List<IUser>, bool> fn = ulContainsJohn.Compile();
Assert.AreEqual(true, fn(userList));

Minimum = 3;

Assert.AreEqual(true, fn(userList));
票数 1
EN

Stack Overflow用户

发布于 2010-08-06 22:18:52

您必须将其设置为参数。

代码语言:javascript
复制
    Expression<Func<List<IUser>, int,  bool>> ulContainsJohn = 
                (List<IUser> l, int min) =>  (l.Where(u => u.FirstName == "John").Count() > min);


    ulContainsJohn.Compile()(userList, min);
票数 1
EN

Stack Overflow用户

发布于 2010-08-06 22:18:50

最简单的解决方案是创建一个单独的变量:

代码语言:javascript
复制
    int min = 0;
    int staticMin = min;
    Func<List<IUser>, bool> ulContainsJohn = 
                l => l.Where(u => u.FirstName == "John").Count() > staticMin ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3424622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档