【问题标题】:C# Declare variable in lambda expressionC# 在 lambda 表达式中声明变量
【发布时间】:2011-06-15 19:50:04
【问题描述】:

我想做一个像这样的简单 lambda 表达式:

IList<MyEntity1> list = GetSomeList();

MyEntity1 result = list.SingleOrDefault<MyEntityList>(
    e => GetMyEntity2(e) != null && GetMyEntity2(e).Id != null && GetMyEntity2(e).Id > 0
);

效果很好,但是从 MyEntity1 获取 MyEntity2 并不是那么简单,所以我想在 lambda 表达式中声明一个变量来保存 MyEntity2 并使用它,而不是一次又一次地调用 GetMyEntity2 方法。这可能吗?

注意:代码只是一个例子,反映了我的真实情况。

谢谢!

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    好吧,首先,您是否尝试在 linq to sql/实体框架/其他中使用它?

    如果没有,那么就这样做

    list.SingleOrDefault(e => {
       var entity = GetMyEntity2(e);
    
       return entity != null && entity.Id != null && entity.Id > 0;
    });
    

    【讨论】:

    • 是的,这正是我所寻找的,效果很好。谢谢!
    【解决方案2】:

    如果你想使用“查询理解”句法形式,你可以这样做:

    var query = from entity1 in list
                let entity2 = GetMyEntity2(entity1)
                where entity2 != null
                where entity2.Id != null 
                where entity2.Id > 0
                select entity1;
    var result = query.SingleOrDefault();
    

    另请注意,中间的“where”子句可能不是必需的。如果“entity2.Id”是一个可为空的 int,那么提升的&gt; 运算符将正确地检查它是否为空。

    【讨论】:

    • @Eric Lippert 不知道这种语法。但我认为我看到@Darren Kopp 解决方案更清晰、更容易理解。不管怎么说,还是要谢谢你!关于中间的“where”子句,正如我所说,这只是一个例子,那些不是真正的子句。但还是再次感谢,不知道我可以比较 int 吗?。
    • @Eric - 您是否有理由使用多个 where 而不是单个 where 和 &&?
    • @Steven:只是因为它看起来不错。顺便说一句,Jon Skeet 今天有一篇关于此选择的性能影响的博客文章。他们有点令人惊讶。
    • 使用&amp;&amp; 然后嵌套where 子句不是更好吗?您可以将它们格式化为看起来几乎相同,它们更具表现力(“where x and y”比“where x where y”更具表现力)并且它们会产生更易于运行的代码。
    • @configurator:我不认为一种方法比另一种更好或更差。
    【解决方案3】:

    您可以使用Select 运算符:

    IList<MyEntity1> list = GetSomeList();
    
    MyEntity1 result = list
        .Select(x => new { Item = x, Entity2 = GetMyEntity2(x) })    
        .SingleOrDefault(x => x.Entity2 != null && x.Entity2.Id != null && x.Entity2.Id > 0);
    

    或者,由于您在通过GetMyEntity2 推送它之后甚至没有使用Item,所以您可以:

    MyEntity1 result = list
        .Select(x => GetMyEntity2(x))    
        .SingleOrDefault(x => x != null && x.Id != null && x.Id > 0);
    

    【讨论】:

    • 感谢@Kirk Woll,但我找到了更轻松的@Darren Kopp 解决方案。这个比另一个有什么好处吗?
    • @Diego,在你的例子中,不是那么多。但是,我的解决方案更通用,并且也适用于 Linq-To-Sql 等。 (至少,只要您不调用 GetMyEntity2 之类的自定义方法,它就可以了)。它还具有“纯功能性”的模糊优势。
    • 好的,+1 因为我会注意@Darren Kopp 解决方案不适用的其他情况,谢谢!但是对于这种情况,我认为我正在寻找的答案(和简单的解决方案)是@Darren's。
    猜你喜欢
    • 2013-05-24
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多