2009-10-22 170 views
7

我可以使用lambda表达式简化此语句吗?Lambda表达式

var project = from a in accounts 
       from ap in a.AccountProjects 
       where ap.AccountProjectID == accountProjectId 
       select ap; 

回答

3

老实说,这对我来说很清楚。我认为这种情况下的lambda可能不太可读,也就是像Brandon在下面发布的内容。

(布兰登的帖子被盗)

var project = accounts.Select(a => a.AccountProjects) 
         .Where(x => x.AccountProjectID == accountProjectId); 

至于可读性而言,我认为,一对夫妇循环最好的拉姆达解决方案,我认为您的解决方案是最好的循环。

+4

这取决于你如何编写它 - 在“.Where”之前添加一个换行符,并且lambda实际上非常易读。 – 2009-10-22 18:56:56

+1

我有点赞同Ed。你现在拥有的是完全可读的,lambda并不能真正简化任何事情。如果有的话,这可能是一个偏好问题。 – Brandon 2009-10-22 18:57:48

+1

即使有换行符,对我来说它仍然不太可读,但我认为这是一个主观的东西。我想重点是;这是非常清楚的,移动到一个真正的问题! :) – 2009-10-22 19:03:18

4
var project = accounts.SelectMany(a => a.AccountProjects) 
         .Where(x => x.AccountProjectID == accountProjectId); 

这是否真的简单是一个味道的问题。

+0

我认为来自子句的多个从概念上讲比隐式扁平化的SelectMany更简单,但无论如何,LINQ语法的整体点不是给这些链式方法提供更清晰的语法吗? – Joren 2009-10-22 19:29:24

+0

这两种方法在概念上是等效的。他们做同样的事情。他们是表达完全相同的一组操作的两种不同方式。正如我在答复中指出的那样,你觉得“更清洁”或“更简单”是一个有趣的问题。 – Mark 2009-10-22 19:39:59

2

我同意Ed Swangren。这看起来简洁并且足够可读。

其实问题的答案取决于三两件事:

  1. 你想实现什么 - 更好的可读性?更好的性能?等等
  2. '帐户'的类型
  3. 如何使用最终的集合。

如果你想更好的性能,并且如果“账户”是一个列表,并将得到的集合将被重复或传递到另一个方法的几行代码后迭代很快就好了,我会做这样的事情:

List<Account> filteredAccounts = new List<Account>(); 
accounts.ForEach(a => { if (a.AccountProjectID == accountProjectId) filteredAccounts.Add(a); }); 

当然它的可读性变差那么你的LINQ的声明,但我会用这两条线,而不是accounts.Select .......

,肯定这是更好的性能优化,我相信总是很重要。

+2

在LINQ查询上调用'ToList()'有什么好处? – 2009-10-22 19:16:57

+0

这个问题没有要求你优化它,它要求你简化它。当你说它“针对性能进行了更好的优化”时,你也做出了相当大的假设。你真的测试过它吗?你有数据来支持你的假设吗? – Mark 2009-10-22 19:19:58

+0

1.你称之为简化 - 是一个品味问题。我想我在之前的文章中回答了这个问题。 2.当然我测试过它。别的我不会发布它。问题不在于查询中调用ToList。平均LINQ to objects比传统技术慢两倍以上(例如使用foreach循环迭代)。不要相信我?你可以轻松地微调它只是谷歌它。此处使用的每个扩展方法和lambda表达式都会为您提供比foreach循环更好的性能。顺便说一下,我花了相当多的精力研究成本,相信我 – Alexander 2009-10-23 09:04:14

0
accounts 
    .SelectMany (
     a => AccountProjects, 
     (a, ct) => 
     new 
     { 
      a = a, 
      ap = ap 
     } 
    ) 
    .Where (t => (t.ap.AccountProjectID == t.a.accountProjectId)) 
    .Select (t => t.ap)