三元条件下的 C# Null 条件
C# Null Conditional in Ternary condition
正在重构一些旧代码并看到以下格式的内容:
Type = rec["IsFlagged"]?.ToString() == "True" ? "Yes" : "No"
如果 rec["IsFlagged"] 为 null,这将不起作用,在这种情况下我需要 return null。如果可能的话,一个重构如何将代码保持在一行中?
我可以做类似的事情,但我想知道是否可以在一行中实现以下内容以对代码进行最少的更改
if (rec["IsFlagged"] != null)
{
return rec["IsFlagged"].ToString() == "True" ? "Yes" : "No"
}
else
{
return null
}
谢谢,
原始代码工作正常。
rec["IsFlagged"]?.ToString() == "True" ? "Yes" : "No"
那个? .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");
这会如你所愿..
rec["IsFlagged"]?.ToString().Replace("True","Yes").Replace("False","No")
..但你也许不应该这样做!
我更喜欢 Garr 的建议,尽管如果它是 rec 中的 bool(rec 是 DataRow 吗?)我会跳过带有字符串的 ToString/compare,一旦我们知道它不为空就将其用作 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()
如果您想更改返回的字符串(本地化?)或提供参数
正在重构一些旧代码并看到以下格式的内容:
Type = rec["IsFlagged"]?.ToString() == "True" ? "Yes" : "No"
如果 rec["IsFlagged"] 为 null,这将不起作用,在这种情况下我需要 return null。如果可能的话,一个重构如何将代码保持在一行中?
我可以做类似的事情,但我想知道是否可以在一行中实现以下内容以对代码进行最少的更改
if (rec["IsFlagged"] != null)
{
return rec["IsFlagged"].ToString() == "True" ? "Yes" : "No"
}
else
{
return null
}
谢谢,
原始代码工作正常。
rec["IsFlagged"]?.ToString() == "True" ? "Yes" : "No"
那个? .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");
这会如你所愿..
rec["IsFlagged"]?.ToString().Replace("True","Yes").Replace("False","No")
..但你也许不应该这样做!
我更喜欢 Garr 的建议,尽管如果它是 rec 中的 bool(rec 是 DataRow 吗?)我会跳过带有字符串的 ToString/compare,一旦我们知道它不为空就将其用作 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()
如果您想更改返回的字符串(本地化?)或提供参数