Проверка на наличие результата в Linq-to-xml - PullRequest
2 голосов
/ 29 марта 2010

Я использую Linq-to-XML для простой проверки «зарегистрирован этот пользователь» (здесь нет защиты, просто составление списка зарегистрированных пользователей для настольного приложения). Как мне обработать результат от запроса как это:

var people = from person in currentDoc.Descendants("Users")
                     where (string)person.Element("User") == searchBox.Text
                     select person;

Я понимаю, что наиболее распространенным способом использования результата будет что-то вроде

foreach (var line in people){
    //do something here
}

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

Я осмотрел этот сайт и MSDN и пока не нашел чёткого ответа.

Дополнительный кредит: Дайте хорошее объяснение того, что содержит people.

Ответы [ 4 ]

5 голосов
/ 29 марта 2010

Я читал, что лучше использовать Any (), а не Count () == 0 в этих ситуациях. * 1001 например *

bool anyPeople = people.Any();
if (anyPeople) {

См. http://rapidapplicationdevelopment.blogspot.com/2009/07/ienumerablecount-is-code-smell.html для более подробного обсуждения влияния на производительность использования Count () с Linq, особенно с IEnumerable, где вся коллекция повторяется методом Count ().

Также использование Any (), возможно, является более ясным объяснением вашего намерения, что Count ()

1 голос
/ 29 марта 2010

Попробуйте использовать:

from person in currentDoc.Descendants("Users")
where (string)person.Element("User") == searchBox.Text && !person.IsEmpty
select person;

Выше будут выбраны только непустые элементы персонажа. Существует также свойство HasElements, которое сообщает, есть ли у него какие-либо дочерние элементы - это может быть лучше использовать в зависимости от вашей XML-структуры, поскольку пробел заставляет make IsEmpty возвращать false (пробел может считаться текстом).

Переменная people будет переменной IEnumerable<XElement>, поскольку вы, похоже, запрашиваете коллекцию XElement. Ключевое слово var - это просто ярлык, позволяющий компилятору набирать переменную, поэтому вам не нужно заранее определять тип и использовать List<XElement> people = ...

0 голосов
/ 29 марта 2010

Как сказал Мэтт, используйте Count()==0 или Any().

человек это IEnumerable<XElement> Я думаю.

0 голосов
/ 29 марта 2010

Вы можете просто сделать people.Count (), и если вы получите 0, вы знаете, что человек не зарегистрирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...