【问题标题】:Can I get any terser with lambdas?我可以用 lambdas 获得任何更简洁的内容吗?
【发布时间】:2009-07-31 12:42:49
【问题描述】:

这些天我用 lambdas 编写了很多代码。

return _schema.GetAll<Node>()
           .ToList()
           .FindAll(node => node.Type == NodeType.Unmanaged)
           .Cast<Shape>()
           .ToList();

注意:GetAll() 返回一个 IList。

我可以得到任何更简洁的东西吗?

【问题讨论】:

  • 如何编辑代码以使其显示在两行上?
  • 在代码的适当位置添加换行符,确保第二行的间距适当。
  • Terser 更好,但更简洁也一样好。

标签: c# lambda


【解决方案1】:
  1. 您可以将 ToList 后跟 FindAll 替换为 Where。
  2. 在简单语句中使用 lambda 参数的流行标准是单个字符。 'node' 可以重命名为 'n'。
  3. 您的方法可以返回 IEnumerable 而不是 IList。然后,如果需要,方法调用者可以调用 ToList。

之后:

return _schema.GetAll<Node>().Where(n => n.Type == NodeType.Unmanaged).Cast<Shape>();

【讨论】:

  • 你在哪里找到了 lambdas 的“命名标准”?在许多情况下,您的建议会损害可读性。
  • .NET Framework 设计指南书中包含 lambda 的所有代码示例仅使用单个字符作为 lambda 参数名称 - blogs.msdn.com/mirceat/archive/2008/03/13/…
  • 您认为那本书中的代码示例构成了“命名标准”?虽然在某些情况下,单个字母确实有意义,但对于更复杂的表达式,它可能是造成混淆的主要来源。这些只是示例(旨在简洁,不一定可读和可维护)。
  • 是官方的吗?没有。不过,大多数来自 Microsoft 的 lambda 代码示例都使用单个字符作为参数名称 - weblogs.asp.net/scottgu/archive/2007/04/08/… - 这本书只是一个示例(尽管值得注意的是它是由决定标准的人编写的)。跨度>
  • 你们俩都赢了……现实情况是,如果不是规定的标准,一个字母的名字也是一种实践的标准。仅仅因为其他人这样做并不意味着你必须这样做,如果你想在你的 lambdas 中比 super 更具表现力:)
【解决方案2】:

这应该可行。

return _schema.GetAll<Node>()
    .Where(node => node.Type == NodeType.Unmanaged)
    .Cast<Shape>()
    .ToList()

如果您的方法的返回类型为 IEnumerable&lt;Shape&gt;,则无需调用 ToList()

你也可以这样写(IEnumerable&lt;Shape&gt; 返回类型):

return from node in _schema.GetAll<Node>()
       where node.Type == NodeType.Unmanaged
       select node as Shape;

【讨论】:

    猜你喜欢
    • 2013-09-10
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多