我在课堂下面,
public class DataCls
{
public string Message { get; set; }
public string Priority { get; set; }
public string Key { get; set; }
}
在下面的代码中,我试图根据“消息”和“优先级”的值生成“密钥”。
如果“Message”和“Priority”为空,则值应为“NA”。
下面的代码不起作用,字符串连接没有发生。这有什么不对?
List<DataCls> lstData = new List<DataCls>
{
new DataCls {Message="M1", Priority=null, Key=null },
new DataCls {Message=null, Priority="P1", Key=null }
};
lstData.ForEach(a => a.Key = a.Message == null ? "NA" : a.Message + ":" + a.Priority == null ? "NA" : a.Priority);
答案 0 :(得分:3)
括号帮助,最后它永远不会为空,因为它被添加到静态字符串然后进行比较。
lstData.ForEach(
a => a.Key = a.Message == null ? "NA" :
a.Message + ":" + (a.Priority == null ? "NA" : a.Priority));
但是这样更好
lstData.ForEach(
a => a.Key = a.Message == null ? "NA" : a.Message + ":" + (a.Priority ?? "NA"));
虽然你可能真的打算成为这个
lstData.ForEach(a => a.Key = $"{a.Message ?? "NA"}:{a.Priority ?? "NA"}");
答案 1 :(得分:0)
在三元组周围加上括号来控制操作的顺序。如果没有括号,C#将在评估+
之前评估==
。您null
检查的作用相当于:
var foo = "Some Value";
var bar = null;
foo + bar == null; // false
这是要求C#首先将"Some Value"
与null
连接起来,然后检查结果是否为null
。
您的最终解决方案可能看起来像这样。
https://dotnetfiddle.net/DFuwij
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<DataCls> lstData = new List<DataCls>
{
new DataCls {Message="M1", Priority=null, Key=null },
new DataCls {Message=null, Priority="P1", Key=null }
};
lstData.ForEach(a => {
a.Key = a.Message == null ?
"NA" :
a.Message + ":" + (a.Priority == null ?
"NA" :
a.Priority);
});
foreach(var d in lstData)
{
Console.WriteLine(d.Key);
}
}
}
public class DataCls
{
public string Message
{
get;
set;
}
public string Priority
{
get;
set;
}
public string Key
{
get;
set;
}
}
输出
M1:NA
NA