【问题标题】:Boolean on List gives erratic results列表上的布尔值给出不稳定的结果
【发布时间】:2020-06-21 02:24:42
【问题描述】:

我有这行代码:

bool existsbuy = pricelist.Exists(element => (element <= TPbuyRange) && (element >= Convert.ToDouble(JsonResP.prices[0].closeoutBid)));

这没有按预期工作,它总是让我错了。 我对此进行了修改,效果很好,它为我提供了应有的布尔结果:

bool existsbuy1 = pricelist.Exists(element => (element <= TPbuyRange) );
bool existsbuy2 = pricelist.Exists(element => (element >= Convert.ToDouble(JsonResP.prices[0].closeoutBid)));

然后我有这个,它与第一行非常相似,而且效果也很好:

bool existssell = pricelist.Exists(element => element >= TPsellRange & element <= Convert.ToDouble(JsonResP.prices[0].closeoutBid));

所以我不明白,这里有什么问题?

【问题讨论】:

  • 您需要在此处包含更多信息。例如,pricelist 是什么?如果它是List&lt;something&gt;,其中something 不是内置的.NET 类型,请提供something 的定义。
  • 另外,existsbuy1 &amp;&amp; existsbuy2 在逻辑上并不等同于existsbuyexistsbuy 要求单个元素同时满足两个条件,而 existsbuy1existsbuy2 可以同时为真,即使不同的元素满足各自的条件。
  • 第一个和第二个不一样——第一个元素必须小于 tpbuyrange 并且同时大于收盘价。在第二种情况下,至少一个元素必须小于买入范围,而另一个可能不同的元素必须大于收盘价
  • 在第三个中存在el1 - 是故意的 & 还是您复制 && 时输入错误?

标签: c# list boolean compare


【解决方案1】:

考虑一下:

list = 10,20,30

list.Exists(e => e < 20 && e > 20); //false, no element is less than 20 and also greater than 20

对比

list.Exists(e => e < 20); //true, element 10 is less than 20
list.Exists(e => e > 20); //true, element 30 is greater than 20

你的另一个工作可能是这样的:

list.Exists(e => e < 30 && e > 10); //true, element 20 is less than 30 and also greater than 10

在不知道你的价值观的情况下,我们不能准确地说出来,但这就是原因


我还要指出,因为您的 Convert.ToDouble(...) 实际上是一个常量,所以您应该在 LINQ lambda 之外执行它

【讨论】:

  • 您可以看到该行包含“=”,因此它应该在您的示例中包含 20
  • 你错过了我想说的重要内容。我正在说明互斥的布尔条件。如果需要,请阅读e &lt;= 19 &amp;&amp; e &gt;= 21;这不是关于“大于”与“大于或等于”,而是关于两个特定事物不可能同时为真,例如answer == "yes" &amp;&amp; answer == "no"
  • 我发现我关于existsbuy1 和existsbuy2 这两条单独的行的逻辑错误。但我仍然不明白为什么第一行不起作用,以及如何处理......我在 list 中有一些值。我试图找出它们中的任何一个是否在 "TPbuyRange" 和 "Convert.ToDouble(JsonResP.prices[0].closeoutBid)" 这两个值的范围内,这两个值永远不会相同。所以我认为它应该可以工作......
  • 这不是关于它们是相同的值。我可以选择一个使用不同值的示例,例如 list.Exists(e =&gt; e &lt; 11 &amp;&amp; e &gt; 29); - 这些值不相同,但列表中仍然没有同时小于 11 和大于 29 的值。没有数字宇宙满足这一点。让我们试着找到一个,从 1 开始:1 less than 11? TRUE. 1 less than 29? FALSE. TRUE &amp;&amp; FALSE == FALSE。尝试 2:2 less than 11? TRUE. 2 less than 29? FALSE. TRUE &amp;&amp; FALSE == FALSE。继续自己尝试寻找真实的东西;下周你仍然会尝试!
【解决方案2】:

如果单独的条件都返回 true,则表明该列表包含至少一项满足条件元素 = Convert.ToDouble(JsonResP.prices[0 ].closeoutBid))。但是,如果联合条件没有返回与 existsbuy1 && existsbuy2 相同的值,则表明列表中没有项目同时满足这两个条件。

【讨论】:

    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 2012-10-05
    • 2018-01-22
    • 2017-09-28
    • 2015-06-17
    • 2011-08-21
    • 2013-10-13
    • 2019-06-11
    相关资源
    最近更新 更多