【问题标题】:Conditionally take some, or all, items有条件地拿走一些或全部物品
【发布时间】:2018-06-08 14:59:51
【问题描述】:

如何向Take() 调用添加条件?

query.Take(isTrue ? 10 : 0);

我想取查询返回的所有项目,而不是 0。

【问题讨论】:

  • 您没有为这个问题提供任何背景信息,我的第一直觉告诉我,您尝试签入 isTrue 的任何条件都应该在 Take() 之前检查,您可以获得列表中的 Count() 项,但是那将是非常低效和错误的

标签: c# linq


【解决方案1】:

Take 并没有真正的“全部”参数,但您可以有条件地应用该子句。

IEnumerable query = something;
if (isTrue)
   query = query.Take(10);

...

【讨论】:

  • 当我们只需要 10 个项目时,为什么要拿走所有项目并在系统上产生开销。
  • @habib 你不是,除非你把ToList 放在错误的位置(惰性枚举)。这只是明确写了 . 链接所做的同一行
【解决方案2】:

如果您真的想要使用条件运算符,那么这将是继续的方式:

var result = query.Take(isTrue ? 10 : query.Count());

虽然,我不得不承认如果queryIEnumerable<T>,那么与其他答案相比,这是次优的。

如果它是一个列表,那么在性能方面的等效版本将是:

var result = query.Take(isTrue ? 10 : query.Count);

【讨论】:

  • 添加一个“次优”有多糟糕的链接会很有用 :-) 但它们很难找到(好的)...这个链接也不是最理想的 :-) stackoverflow.com/q/28756/613130
  • @xanatos 取决于我猜的用例,但“次优”有时根本不重要;-)。我会说,如果您像我一样喜欢打代码,那么我会继续使用当前的方法,除非我知道它会导致我出现性能问题,但是其他人会再次争论它是否是生产代码,那么我将使用 if 声明可读性等...
  • 只是为了超级清楚。 “次优”意味着它枚举 整个 列表以获取计数(所以最好的情况是现在枚举两次)
  • @BradleyDotNET 如前所述,这取决于query 实际上 是什么类型。根据实际类型,可以避免“枚举两次”。
  • 当然;我认为这很清楚,但这仅适用于IEnumerable 案例:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多