检查Linq-to-xml中是否存在结果

时间:2010-03-29 18:15:13

标签: c# linq-to-xml

我正在使用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 个答案:

答案 0 :(得分:5)

我已经读过在这些情况下最好使用Any()而不是Count()== 0。 E.g

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

有关在Linq中使用Count()的性能影响的更多讨论,请参阅http://rapidapplicationdevelopment.blogspot.com/2009/07/ienumerablecount-is-code-smell.html,特别是对于IEnumerable,其中整个集合由Count()方法迭代。

同样使用Any()可以说是对Count()

的意图的更清楚的解释

答案 1 :(得分:1)

尝试使用:

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 = ...

答案 2 :(得分:0)

你可以做一个people.Count(),如果你得到0,你知道那个人没有注册。

答案 3 :(得分:0)

正如Matt所说,使用Count()==0Any()

我认为人是IEnumerable<XElement>