【问题标题】:How do I write a C# lambda returning "true" at all times most elegantly?如何以最优雅的方式编写始终返回“true”的 C# lambda?
【发布时间】:2012-12-01 03:42:37
【问题描述】:

我想调用Queryable.Where() 并获取所有元素。没有任何版本的Where() 可以在没有谓词函数的情况下工作。所以我必须纠正这个:

 var result = table.Where( x =>  true );

它有效,但我觉得这很愚蠢 - x 从未使用过,=>“箭头”符号没有“转换”。

有没有更优雅的解决方案?

【问题讨论】:

  • 为什么需要调用Where 才能获得所有结果?只需省略调用即可。
  • 为什么不让它不带谓词呢? var result = table;
  • 同意@Mark 认为这个调用不是必需的,但即使它 必需的(因为您使用了其他一些消耗 lambda 的方法,而忽略调用将'没有意义)在这种情况下x => true 没有任何问题。
  • “没有任何版本的Where() 可以在没有谓词函数的情况下工作” - 你有什么情况需要一个?
  • 如果您告诉我们您想要实现的目标以及在什么情况下我们可以帮助您

标签: c# linq lambda


【解决方案1】:

你可以使用以下,更优雅:

var result = table;

你也可以完全省略result,直接使用table

【讨论】:

    【解决方案2】:

    table.Where(x=>true) 本质上不是一个 noop 吗?我的意思是,有什么意义?不过,您可以使用 _ 而不是 x,这是惯用的。

    table.Where(_=> true);
    

    但实际上,您正在执行以下操作:

    for (var item in table)
    {
        if (true) // your Where() clause..
        {
            yield item;
        }
    }
    

    看看它怎么没有真正的意义?

    【讨论】:

    • 我没有 DV,但你的回答基本上重申了 OP 的问题——x => true 的投诉似乎是个问题。而且我不知道您将与所谓的惯用 _ => true 一起去哪里。将标识符的名称从x 更改为_ 是没有意义的。
    • downvote 对我来说没有意义,但您通过代码的解释绝对可以帮助 Linq 的新手,所以 +1
    • @KirkWoll,也许 noop 是一个不好用的短语——我的意思是它毫无意义。是的,lambda 变量_ 用于表示您实际上并未在 lambda 主体中使用该变量。
    • @Josh,我明白你现在在说什么了。我现在也看到了it is in fact idiomatic,就像你描述的那样。所以+1。
    【解决方案3】:

    table.Where( x => true ) 不是“返回所有元素”。它只是返回一个可枚举,该可枚举具有足够的信息来返回元素的子集当它被枚举时。在您枚举它之前,不会“返回”任何元素。

    由于在这种情况下这个子集甚至不是proper(即所有元素都被返回),所以这本质上是一个空操作。

    要枚举所有元素,请编写一个简单的foreach,或使用ToListToArray,或者如果您不关心实际返回任何元素(只想枚举,大概是为了副作用) :table.All(x => true)table.Any(x => false),甚至只是 table.Count()

    【讨论】:

      【解决方案4】:

      在这种情况下,您不需要调用 Where,因为您没有过滤 Queryable。

      如果您仍然希望调用 Where 并且在许多地方执行此操作,您可以定义一个静态 Func 并重用它:

          public static Func<int, bool> t = ReturnTrue;
      
          public static bool ReturnTrue(int i) 
          {
              return true;
          }
      
          table.Where(t);
      

      【讨论】:

        【解决方案5】:

        如果您尝试获取table 内容的副本而不是参考,

        var result = table.ToList();
        

        但不清楚这是否真的是你想要完成的。详情?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-23
          • 1970-01-01
          • 2020-05-05
          • 2018-04-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-09
          • 1970-01-01
          相关资源
          最近更新 更多