C#声明lambda表达式中的变量

Die*_*ego 13 c# linq lambda

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

IList<MyEntity1> list = GetSomeList();

MyEntity1 result = list.SingleOrDefault<MyEntityList>(
    e => GetMyEntity2(e) != null && GetMyEntity2(e).Id != null && GetMyEntity2(e).Id > 0
);
Run Code Online (Sandbox Code Playgroud)

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

注意:代码只是反映我的实际情况的一个例子.

谢谢!

Dar*_*opp 32

好吧,首先,你是否试图在linq中使用它来实现sql/entity framework/other?

如果没有,那就这样做吧

list.SingleOrDefault(e => {
   var entity = GetMyEntity2(e);

   return entity != null && entity.Id != null && entity.Id > 0;
});
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 8

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

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();
Run Code Online (Sandbox Code Playgroud)

另请注意,中间的"where"子句可能不是必需的.如果"entity2.Id"是一个可空的int,则提升的>运算符将正确地检查它是否为null .

  • @Steven:只是因为它看起来不错.顺便提一下,Jon Skeet今天有一篇关于这种选择的性能影响的博客文章.他们有点令人惊讶. (2认同)

Kir*_*oll 5

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

或者,由于您甚至没有Item在将其推入后使用它,因此GetMyEntity2可能只有:

MyEntity1 result = list
    .Select(x => GetMyEntity2(x))    
    .SingleOrDefault(x => x != null && x.Id != null && x.Id > 0);
Run Code Online (Sandbox Code Playgroud)