我正在尝试将数据结构保存为xml,如下所示:
return new XElement ( "EffectFile",
new XElement ( "Effects", this.Effects.Select ( e => new XElement ( "Effect", e.EffectType ) ) )
).ToString ( );
创建了这样的东西:
<EffectFile>
<Effects>
<Effect>Blur</Effect>
<Effect>Sharpen</Effect>
<Effect>Median</Effect>
</Effects>
</EffectFile>
但是我还想要一个条件,如果一个效果具有不透明度,我想在效果中保存它。
我无法锻炼如何在lambda表达式中嵌套该条件以创建嵌套的XElement。
编辑:那么对于Opacity,让我们说它是这样的:
if (e.Opacity != null) new xElement("Opacity", e.Opacity)
答案 0 :(得分:4)
最好像这样存储文件:
<EffectFile>
<Effects>
<Effect>
<EffectType>Blur</EffectType>
<Opacity>100</Opacity>
</Effect>
</Effects>
</EffectFile>
_
return new XElement("EffectFile",
new XElement("Effects", this.Effects.Select(e => new XElement("Effect", new XElement("EffectType", e.EffectType), e.Opacity != null ? new XElement("Opacity", e.Opacity) : null)))
).ToString();
答案 1 :(得分:1)
假设Opacity
是您班级的float
实例属性,您可以将三元运算符(?:)与Concat
扩展方法结合使用。
return new XElement("EffectFile",
new XElement("Effects",
this.Effects
.Select(e => new XElement("Effect", e.EffectType))
.Concat(this.Opacity > 0.0f
? new[] { new XElement("Opacity", this.Opacity) }
: Enumerable.Empty<XElement>()
)
)
)
.ToString();
我的补充的翻译:
如果不透明度大于零,请创建一个大小为1的新列表(带有不透明度元素),并将其附加到效果列表。如果不透明度小于或等于零,则创建一个大小为零的新列表,并将其附加到效果列表(基本上是无操作,就列表而言)。
如果不透明度为&lt; = 0,您的输出文件将类似于您在问题中指定的输出文件,如果是&gt;则输出文件应如下所示: 0:
<EffectFile>
<Effects>
<Effect>Blur</Effect>
<Effect>Sharpen</Effect>
<Effect>Median</Effect>
<Opacity>0.75</Opacity>
</Effects>
</EffectFile>
编辑:
要符合您的新规范,只需将this.Opacity > 0.0f
更改为this.Opacity != null
,并确保为ToString
定义了相应的Opacity
方法。生成的XML最终会看起来或多或少相同。