0

我正在重构一些旧代码并查看以下格式的内容:

Type = rec["IsFlagged"]?.ToString() == "True" ? "Yes" : "No"

如果 rec["IsFlagged"] 为空,这将不起作用,在这种情况下,我需要返回空。如果可能的话,如何重构以将代码保留在一行中?

我可以做类似的事情,但我想知道是否可以在一行中实现以下对代码的最小更改

    if (rec["IsFlagged"] != null)
    {
       return rec["IsFlagged"].ToString() == "True" ? "Yes" : "No"
    }
    else 
    {
        return null
    }

谢谢,

4

2 回答 2

1

原始代码工作正常。

rec["IsFlagged"]?.ToString() == "True" ? "Yes" : "No"

这 ?运算符 before.ToString()防止在 null 时调用该方法。结果rec["IsFlagged"]?.ToString()将是null

然后,它比较null哪个"True"是假的(它们不相等)。

然后三元运算符评估"No"并将其分配给左值。

编辑所以,现在你想要 3 个可能的结果:“是”、“否”或 null。一个三元组只给你两个选择。有很多可能性,你的很好,除非你有多个地方做类似的事情。在这种情况下,您可以使用扩展方法:

public String CheckTrue(this object input) {
    return input?.ToString() == "True" ? "Yes" : "No"
}

然后在您的具体情况下:

return rec["IsFlagged"]?.CheckTrue()

另一种选择是使用多个三元运算符?

return rec["IsFlagged"]==null ? null : (rec["IsFlagged"].ToString() == "True" ? "Yes" : "No");
于 2021-10-26T23:06:27.937 回答
0

这会想要你想要的..

rec["IsFlagged"]?.ToString().Replace("True","Yes").Replace("False","No")

..但你也许不应该这样做!

我更喜欢 Garr 的建议,但如果它是 rec 中的 bool(rec 是 DataRow 吗?)我会跳过 ToString/与字符串比较,一旦我们知道它不为空,就将其用作 bool

return rec["IsFlagged"]==null ? null : ((bool)rec["IsFlagged"] ? "Yes" : "No");

但总的来说,我更喜欢扩展方法方法,我们可以对其进行一些调整,利用 bool-or-null-stored-in-object 和bool?:

public static string ToNullaboolString(this bool? x, string t = "Yes", string f = "No", string n = null){
  if(x.HasValue) 
    return x.Value ? t: f;
  return n;
}

像这样称呼它:

((bool?)rec["IsXxx"]).ToNullaboolString()

如果要更改返回的字符串(本地化?),或者提供参数

于 2021-10-27T05:24:25.347 回答