Как создать вложенный XElement на основе условия? - PullRequest
1 голос
/ 25 февраля 2011

Я пытаюсь создать сохранить структуру данных в формате 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>

Но я также хочу иметь условие, что если у эффекта есть непрозрачность, я хочу сохранить его и внутри эффекта.

Я просто не могу понять, как вложить это условие в лямбда-выражение для создания вложенного XElement.

РЕДАКТИРОВАТЬ: Итак, для непрозрачности, скажем, что-то вроде этого:

if (e.Opacity != null) new xElement("Opacity", e.Opacity)

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011

Ваш файл лучше хранить так:

<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 голос
/ 25 февраля 2011

Предполагая, что 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 (с элементом непрозрачности) и добавьте его в список эффектов.Если непрозрачность меньше или равна нулю, создайте новый список с нулевым размером и добавьте его к списку эффектов (в основном это неактивный режим, насколько этот список идет).

Ваш выходной файл будетпохож на тот, который вы указали в своем вопросе, если непрозрачность <= 0, и должен выглядеть так, если он> 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 будет выглядеть более или менее одинаково.

...