null检查不与ForEach Linq一起使用

时间:2016-09-27 05:21:34

标签: c#

我在课堂下面,

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);

2 个答案:

答案 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