转换C#方法以从lambda表达式返回布尔值

时间:2010-02-23 10:42:41

标签: c# lambda

以下显然不会编译,所以我应该更改什么?

public bool IsFoobar(bool foo, bool bar)
{
    return db.Foobars.SingleOrDefault(fb => ((fb.foo == foo) && (fb.bar == bar)));
}

5 个答案:

答案 0 :(得分:13)

尝试

public bool IsFoobar(bool foo, bool bar)
{
    return db.Foobars.Any(fb => fb.foo == foo && fb.bar == bar);
}

答案 1 :(得分:4)

在不知道你的数据模型看起来如何以及你实际希望如何表现的情况下,我猜错了

public bool IsFoobar(bool foo, bool bar)
{
    return db.Foobars.SingleOrDefault(fb => ((fb.foo == foo) && (fb.bar == bar))) != null;
}

修改 虽然您可以使用.Any,但另一张海报说,如果您的数据库有两个匹配的行,那么使用!= null您仍然会抛出异常。但是,如果您不想进行该检查,则应该使用建议的.Any方法。

答案 2 :(得分:1)

也许您正在寻找Any

return db.Foobars.Any(fb => ((fb.foo == foo) && (fb.bar == bar)));

答案 3 :(得分:0)

不完全确定你想要在这里实现什么,但要将其分解为可能有用的部分,首先你可以将lambda定义为(假设db.FooBarsFooBar类型的集合) :

bool foo = ...someBooleanValue...;
bool bar = ...someOtherBooleanValue...;

Func<FooBar, bool> myTest = fb => ((fb.foo == foo) && (fb.bar == bar));

OR,不包括闭包中的foo和bar值:

Func<FooBar, bool, bool, bool> myTest = 
                 (fb, foo, bar) => ((fb.foo == foo) && (fb.bar == bar));

然后在FooBar的特定实例上获取结果(使用第一个lambda示例):

FooBar myFooBar = ...some instance...;

bool result = myTest(myFooBar);

使用第二个lambda示例:

FooBar myFooBar = ...some instance...;
bool foo = ...someBooleanValue...;
bool bar = ...someOtherBooleanValue...;

bool result = myTest(myFooBar, foo, bar);

希望这会有所帮助......

答案 4 :(得分:0)

这不太可能是答案,但重要的是要认识到原始代码可以编译好,因为它前面有正确的定义:

// Ugh! Public data for brevity

class Foobar
{
    public bool foo, bar;
    public static implicit operator bool(Foobar fb) { return fb.foo; }
}

class Db
{
    public IEnumerable<Foobar> Foobars;
}

Db db;

现在原始代码编译得很好:

public bool IsFoobar(bool foo, bool bar)
{
    return db.Foobars.SingleOrDefault(fb => ((fb.foo == foo) && (fb.bar == bar)));
}

但不可否认,如果不这样做可能会更好。