Проверка XElement на наличие одного из нескольких возможных XElement

StackOverflow https://stackoverflow.com/questions/1805475

  •  05-07-2019
  •  | 
  •  

Вопрос

Есть ли способ определить, содержит ли XElement один из указанных элементов? Например, у меня есть XElements, которые я хочу проверить:

Dim xe1 = <color><blue/></color>
Dim xe2 = <color><red/></color>
Dim xe3 = <color><powderBlue/></color>
Dim xe4 = <color><aqua/></color>
Dim xe5 = <color><green/></color>

Я бы хотел иметь возможность запросить любой из элементов xelements, чтобы увидеть, содержат ли они элементы <red/>, <green/> или <blue/> под ними, и вернуть true, если это так, false, если нет.

Я надеялся, что это будет проще, но лучшее, что я мог придумать, было:

Dim primaryColor = From e In xe1.Elements Where e.Name = "blue" Or e.Name = "red" Or e.Name = "green"
Dim primaryColorTrue = primaryColor.SingleorDefault
If primaryColorTrue IsNot Nothing Then
'Blah
End If

У кого-нибудь есть лучший способ сделать это, например, поместить эти элементы красного / зеленого / синего цветов в массив и использовать что-то вроде Elements.Contains (список элементов)?

Это было полезно?

Решение

Если я правильно понимаю - возможно (используя C #, извините - но здесь нет реальной логики, специфичной для C #):

var colors = new[] {"red", "green","blue"};
bool any = el.Descendants().Any(child => colors.Contains(child.Name.LocalName));

Даже если VB борется с вами, я уверен, что вы можете использовать .Any вместо .SingleOrDefault и null проверку.

Для информации, использование здесь элементов для меня звучит странно; Я бы просто использовал имя цвета в качестве текста , если это возможно:

<somexml><color>blue</color></somexml>

или даже как атрибут:

<somexml color="blue"/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top