0

我有以下使用 XML 序列化程序解析的 XML 文件。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Projects>
    <Global>
        <Variables>
            <Variable name="GlobalVar1" value="GV1"/>
            <Variable name="GlobalVar2" value="GV2"/>
        </Variables>
    </Global>
    <Project>
        <Variables>
            <Variable name="LocalVar1" value="LV1"/>
            <Variable name="LocalVar2" value="LV2"/>
        </Variables>
    </Project>
</Projects>

我正在构建一个变量字典 - 名称-值对。我编写了以下 LINQ 语句,它工作正常(假设我在全局和项目范围内没有重复的变量名):

Dictionary<String, String> varDict = Projects.Global.Variables.Select(var => new { var.name, var.value })
                .Union(Projects.Project.Variables?.Select(var => new { var.name, var.value }))
                .ToDictionary(var => var.Key, var => var.value);

现在我有一个转折 - 有时整个<Global>标签都会丢失,或者它不会有<Variables>标签。同样,有时<Variables>标签中会缺少<Project>标签。例如:XML 文件将是:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Projects>
    <Project>
        <Variables>
            <Variable name="LocalVar1" value="LV1"/>
            <Variable name="LocalVar2" value="LV2"/>
        </Variables>
    </Project>
</Projects>

我认为?.如下使用运算符(空条件)会有所帮助,但是当<Global>标签丢失时,以下 LINQ 语句会返回nullvarDictis null):

Dictionary<String, String> varDict = Projects.Global?.Variables?.Select(var => new { var.name, var.value })
                .Union(Projects.Project.Variables?.Select(var => new { var.name, var.value }))
                .ToDictionary(var => var.Key, var => var.value);

我做错了什么或解决方案是什么?

4

1 回答 1

1

?.操作员只是避免抛出 NullReferenceException 。它仍然返回 null。

// If Projects.Global is null:
var var1 = Projects.Global?.Variables; // Does not throw an exception, but var1 is null
var var2 = Projects.Global.Variables; // Blows up and throws a NullReferenceException

如果您希望在.Union()第一部分为空时工作,它需要一些东西来解决。所以类似的东西应该可以工作(可能需要一些调整):

var globalValues = Projects.Global?.Variables?.Select(var => new KeyValuePair<string, string>(var.name, var.value)) 
        ?? new List<KeyValuePair<string, string>>();

Dictionary<String, String> varDict = globalValues
        .Union(Projects.Project.Variables?.Select(var => new KeyValuePair<string, string>(var.name, var.value)))
        .ToDictionary(var => var.Key, var => var.Value);
于 2019-10-19T20:34:27.173 回答