【问题标题】:Is there a quick way to say If notempty x = y else x = default in a Linq where query有没有一种快速的方法可以在 Linq where 查询中说 If notempty x = y else x = default
【发布时间】:2009-07-18 17:25:17
【问题描述】:

有没有快捷的说法

Where (data.x == (If notempty x = y else x = default))

假设被比较的数据都是字符串

Compare listitem.string with passed.string - if passed.string isnotempty, else passed.string equals default value.

在 Linq 'where` 查询中。

很抱歉这个问题写得很糟糕。

...根据更新的 cmets ...

【问题讨论】:

  • 你应该对“x”和“y”代表什么以及它们的实际类型有更多的表现力。
  • 表达式中有赋值和相等吗?
  • 你能澄清一下notempty指的是什么吗?
  • @Chris M - 也许你应该用简单的命令式 C# 编写代码,这样人们就可以建议如何将它翻译成 Linq。目前,您只是让人们猜测您的意思。
  • 当前项目是data.x 还是y?无论如何,鉴于您的修改,我已经更新了我的帖子。

标签: c# linq .net-3.5


【解决方案1】:

好的,随着您对原始帖子的澄清,我想我明白您现在的意思了。

尝试以下子句(其中data.x 是您的当前元素,y 在传递的参数中)。

where y == (string.IsNullOrEmpty(y) ? "default" : data.x)

我不相信这里可以使用空合并运算符,因为您要比较和返回的变量是不同的。

旧帖:
如果什么是空的?我猜你指的是y

对于泛型类型T,您可以使用以下子句:

where data.x == (y ?? DefaultValue<T>())

其中DefaultValueT 的通用函数,它返回所谓的“默认”值。

【讨论】:

  • (y ?? default(T))(y != default(T) ? y : default(T)) 就是 y
  • 好点。它应该只是一个任意函数,而不是 default 关键字。
  • 是的,感谢所有人;以及 280Z28 的 MSDN 链接 msdn.microsoft.com/en-us/library/ms173224.aspx
  • 好吧,我将把这个让给你+1。 ;) 我确实觉得这类问题很有趣,几乎比直接回答的问题更有趣,因为涉及赌博因素。 :)
  • @280Z28:呵呵,谢谢。是的,这个问题有点令人兴奋(至少很不典型),因为我们有效地将赌注押在了可能性上......
【解决方案2】:

这确实取决于x和y的数据类型,但说它们是字符串:

Where (data.x == (!string.IsNullOrEmpty(y) ? y : "default"))

它被称为conditional operator

【讨论】:

  • 这可能接近 OP 想要的。但是请注意,在条件中评估!foo(此处为!string.IsNullOrEmpty(y))被认为是不好的做法。只需切换真/假返回值的顺序就简单多了。 :)
  • @Noldorin:我知道,与问题中的 sn-p 相比,我只是不想交换太多东西;还是提出来的好点,谢谢。
  • 是的,很公平。为了保持一致性,以这种方式保留它可能是有意义的。 (它也更多地对应于空合并运算符。)
  • 如果是这种情况,并且y是“传递的字符串”,那么最好在执行Linq查询之前设置if (string.IsNullOrEmpty(y)) y = "defaultValue";。这是参数验证的一部分。
【解决方案3】:

你原来的帖子可以这样理解:

where (data.x ?? y) == y

编辑:我现在很确定这就是您所尝试的。 :)

编辑 2:这是null-coalescing operator

编辑 3:投票反对我的人应该发布理由。我将第一篇文章解释为:“如果 x 不为空,它应该等于 y,但可以等于 default(typeof y)。”对于引用类型可为空的类型,我的帖子是正确的。

编辑 4:我的仍然可能是对他更新后的帖子最干净的答案。我一直在读它,它的措辞仍然很奇怪。 (string.IsNullOrEmpty(y)) 帖子是另一种可能性。

【讨论】:

  • 诚然,这个问题不是很清楚,但我非常怀疑这是 OP 想要的。一开始你就弄错了 x 和 y。
  • 检查我的编辑。这个措辞在原始帖子中是有道理的,这就是它的使用方式。 “如果用户输入选项 y,请执行一些操作。另外,y 是默认设置,所以如果他们没有输入任何内容,也可以。”这只是一个例子。
  • 没有迹象表明这个“默认”值是y。事实上,恰恰相反——我不明白它会怎样。
  • "default" 指的是data.xy 的类型。这是一个where 子句,所以我不得不假设他不是指分配。
  • 子句中的= 绝对意味着赋值,因为他使用== 表示相等,这是标准的。 x 似乎只是一个临时变量。虽然语法有点模棱两可,但我承认。
猜你喜欢
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 2020-05-04
  • 2020-06-28
  • 2012-12-15
  • 2021-12-13
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多