Как определить, существует ли элемент, используя лямбда-выражение в c #? - PullRequest
5 голосов
/ 06 октября 2011

Я использовал инструкцию try / catch, чтобы узнать, существует ли элемент, когда я анализирую его.Очевидно, это не лучший способ сделать это.Я использовал LINQ (лямбда-выражения) для большинства моих разборов, но я просто не знаю, как определить, есть ли там элемент или нет.

Одна большая проблема с некоторыми решениями, которые я нашел, эточто они берут в 3-4 раза больше кода, чем при использовании блока try / catch, что побеждает цель.

Я бы предположил, что код будет выглядеть примерно так:

if(document.Element("myElement").Exists())
{
   var myValue = document.Element("myElement").Value;
}

Я нашел эту ссылку , но в моем случае зацикливание не требуется, поскольку я могу гарантировать, что оно будет отображаться только один раз, если оно существует.Плюс тот факт, что нужно создать фиктивный элемент, который также кажется ненужным.Не похоже, что это лучший (или хороший) способ проверки.Есть идеи?

Ответы [ 4 ]

4 голосов
/ 06 октября 2011
XElement e = document.Element("myElement");
if (e != null)
{
    var myValue = e.Value; 
}

http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.element.aspx

"Получает первый (в порядке документа) дочерний элемент с указанным именем XName."

"Ничего не возвращает, если нет элемента с указанным именем."

0 голосов
/ 07 мая 2017

Кстати, комментарий выше о "try / catch" может быть правдой, но не во всех случаях.Это зависит от того, как вы строите свое решение.В вашей сборке Release отключите как можно больше флагов, которые пахнут как «Отладка» даже на расстоянии.Чем меньше времени выполнения велено запоминать следы стека и прочее во время сборки, тем быстрее становится «try / catch».

Кстати, # 2: знаменитые архитектурные паттерны «Скажи, не спрашивай!»(TDA) и «Принцип открытого закрытия» (OCP) запрещают использование такого печально известного кода, как «if (! (Fp = fopen (...))». Они не просто поощряют васиспользовать «попробовать / поймать», но заставить вас сделать это, потому что OCP требует не только подчиняться в вашем собственном коде, но и при вызове чужих вещей (например, библиотек, таких как stdio).

Почему OCP, а не TDAв последнем предложении? Потому что вам не разрешено расширять смысл существующего кода. Придерживаясь простого примера «fopen», что вы будете делать, когда результат будет нулевым? Почему именно «fopen» потерпел неудачу? Вы могли быпроверьте, осталось ли достаточно свободного места, или если файловая система доступна для записи. Если имя файла является допустимым. Или еще что-то. Тем не менее, ваша цель не может быть достигнута: откройте файл. Представьте себе приложение без головы, поэтому не нужно вмешательство пользователяВозможно. Теперь что? Нет никаких оснований для дальнейшей работы с вещами, потому что «fopen» не удался. Вам понадобится резервная стратегия. Точка. Если «fopen» потерпел неудачу, он потерпел неудачу.

Практическое правило. Думайте о своем коде как о всегда успешном (KIS).Если ваш код может «потерпеть неудачу» с точки зрения того, что набор результатов регулярно может содержать элементы или нет, поместите логику в класс.Возможно, вам придется распределять данные, свойства, вопросы и методы по различным классам (TDA).Возможно, вам придется перенастроить свой код в соответствии с SLA.

В вашем случае, однако, убедитесь, что элемент существует.Если вы не можете, это не ваша вина.Глубоко в своем коде (оболочка, где все ошибки прежних кодеров облагораживаются) преобразуйте необходимые данные в другую сущность так, чтобы дальше не было необходимости «если».

0 голосов
/ 18 марта 2016

Any() - это самый простой способ проверить, существует ли элемент.

Если вам нужно убедиться, что элемент уникален, вам нужно будет сделать что-то вроде .Count() == 1.В качестве альтернативы вы можете реализовать свой собственный метод расширения, но это будет только оболочка вокруг .Count == 1.

0 голосов
/ 06 октября 2011

Любой () - это команда Linq.

Assert.IsFalse( new [] { 1, 2, 3, 4 }.Any( i => i == 5 ));
...