【问题标题】:Condition doesn't return true when it should条件不应该返回真
【发布时间】:2012-08-10 14:09:15
【问题描述】:

我有以下方法:

public static List<string> GetArgsListStartsWith(string filter, bool invertSelection, bool lowercaseArgs)
{
    return GetArgumentsList(lowercaseArgs)
          .Where(x => !invertSelection && x.StartsWith(filter)).ToList();
}

然后我这样称呼它GetArgsListStartsWith("/", true, false)

这将转化为:获取所有不以“/”开头的参数的列表。 问题是列表没有被填充,即使所有参数都不以“/”开头。

如果我调用GetArgsListStartsWith("/", false, false),它转换为:获取所有以“/”开头的参数的列表,该列表会填充以“/”开头的参数。

我怀疑invertSelection 设置为true 并且x.StartsWith(filter) 返回false 时!invertSelection &amp;&amp; x.StartsWith(filter) 不会返回true,但我不明白为什么。有人看到我看不到的东西吗?

【问题讨论】:

  • 有 invertSelection = false 你说 GetArgumentsList(lowercaseArgs).Where(x => false && someBoolValue) 总是假的
  • 是的...当我认为 false && false 返回 true 时,我不知道我在想什么。我应该休息一下。谢谢!

标签: c# linq conditional-statements where


【解决方案1】:

!invertSelection && x.StartsWith(filter) 的值,其中 invertSelection = true 始终为 false。

【讨论】:

    【解决方案2】:

    正如其他答案所说,只有当invertSelection 为假时,您的条件才会永远返回真。

    有条件地反转结果的最简单方法是使用XOR operator:

    .Where(x => x.StartsWith(filter) ^ invertSelection)
    

    我更喜欢这个而不是 lc 的解决方案,因为它只指定一次 StartsWith。

    【讨论】:

    • 这比!invertSelection == x.StartsWith(filter) 更难阅读。并且对布尔值使用按位运算不一定很好,可以使用!=。
    • @Qnan:对你来说,也许 :) 我个人更喜欢这个 - 或者可能是invertSelection != x.StartsWith(filter)。反转然后使用正常的平等对我的大脑来说太多了......
    • +1 是的,这样更好。出于某种原因,我的大脑一直在思考*-1,只是没有点击。
    • @Qnan - ^ 带有布尔操作数不是按位运算。常见的误解。
    • 谢谢你们。除了犯一个愚蠢的初学者错误之外,我还学会了一种新方法来检查表达式的计算结果是假还是真。
    【解决方案3】:
    .Where(x => invertSelection ? !x.StartsWith(filter) : x.StartsWith(filter))
    

    【讨论】:

    • 嘿,可惜它不会让你纠正错字,因为编辑太小了。
    • 或者只使用==而不是&amp;&amp;
    猜你喜欢
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多