2015-03-17 6 views
1

У меня есть IEumerable<XElement> под названием foo.Избегайте повторения при выполнении A Выберите из IEnumerable

У меня есть этот код

foo.Select(x => new 
     { 
      bars = x.Descendants(namespace + "bar") != null 
       ? x.Descendants(namespace + "bar").Select(z => z.Value).ToArray() 
       : new string[0] 
     }) 
     .ToArray(); 

Как я могу написать это немного аккуратней? Я действительно не хочу, чтобы повторить эту часть

x.Descendants(namespace + "bar") 
+3

использовать переменную и повторно использовать ее –

+1

После того, как C# 6 отсутствует, вы можете использовать [null условный] (http://www.codeproject.com/Articles/825488/New-Features-in-Csharp-Null-Conditional -оператор) '' .'. – mason

+1

Возвращает ли потомки NULL? его отложенный перечислимый? конечно, он будет всегда присутствовать, он просто может быть пустым –

ответ

3

Использование дополнительных Select:

foo.Select(x => x.Descendants(namespace + "bar")) 
    .Select(x => new 
      { 
       bars = x != null ? x.Select(z => z.Value).ToArray() : new string[0] 
      }) 
      .ToArray(); 

Или:

foo.Select(x => 
       { 
        var elements = x.Descendants(namespace + "bar"); 
        return new 
        { 
         bars = elements != null ? elements.Select(z => z.Value).ToArray() : new string[0] 
        } 
       }) 
      .ToArray(); 

BTW, я не думаю, что Descendants вернется null. Вероятно, вы должны проверить, есть ли какие-либо элементы, используя Any способ.

+1

Или просто x.Select (x => x.Value) .ToArray(). Any() не требуется –

1

Вы можете использовать другое выражение лямбда, чтобы избежать повторения, как показано ниже, где вы также можете реализовать нулевую проверку.

Function<XElement,IEnumerable<XElement>> f = 
    x => x.Descendants(namespace + "bar") ?? Enumerable.Empty<XElement>(): 

foo.Select(x => new 
      { 
       f(x).Select(z => z.Value).ToArray(); 
      }) 
      .ToArray(); 
1
foo.Select(x => new 
    { 
     bars = x.Descendants(namespace + "bar") != null 
      ? x.Descendants(namespace + "bar").Select(z => z.Value).ToArray() 
      : new string[0] 
    }) 
    .ToArray(); 

Как я могу написать это немного аккуратней? Я действительно не хочу повторять эту часть

foo.Select(x => new { bars = x.Descendants(namespace + "bar") 
           .Select(z => z.Value).ToArray()}).ToArray(); 

Вам не нужно проверять NULL в качестве потомков возвращает отложила перечислимы, например, он всегда будет иметь экземпляр IEnumerable, это может быть пустой (нет результатов), но . Выберите (z => z.Value) .ToArray() автоматически произведет новую строку [0] {}, если результатов не будет.

+0

Вам нужно объяснить, почему это решение является подходящим и действительным переводом кода OP. – Servy