【问题标题】:Linq to XML: How do you determine if something of type "var" is null or empty?Linq to XML:你如何确定“var”类型的东西是空的还是空的?
【发布时间】:2009-12-09 18:59:22
【问题描述】:

所以,我有一小块尖尖的 xml,看起来像这样:

<Groups UseGroup='True'>
     <Group>1264,182,1979</Group>
</Groups>

我有一小块 linq 从中获取价值,如下所示:

var group = from a in xml.Descendants("Groups")
         select a.Element("Group").Value;

一切都很好,但我不知道如何处理空响应?如果我使用:

if(group != null)

它总是会评估true,因为那里有东西。如果我使用:

if(group.ToString() == "")

它将始终评估为 true,因为对该对象调用的 ToString() 返回 System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] 出于某种原因,我很难过将我的 linq 查询结果转换为字符串,所以我使用 var 因为这似乎是我可以让它工作的唯一方法......

所以问题是,我是否使用了正确的 linq 语法,如果是,我如何判断它是否返回任何内容?

【问题讨论】:

  • 您遇到问题是因为您不了解有关查询的最重要事实:查询的值是 THE QUERY。 “组”是指一个对象,它表示“从这个集合中投射这些值”的逻辑操作。 “组”永远不会为空;它是一个代表该操作的对象,并且该对象永远不会为空。
  • 如果你想问的是“这个查询是否返回任何结果?”,然后在查询上使用序列运算符。例如,“group.Any()”执行查询,如果返回至少一个值,则返回 true,如果没有返回值,则返回 false。
  • 但是让我重复一遍以确保清楚:查询表达式的结果是查询,而不是查询的结果。如果您想要查询的结果,那么您将要做的不仅仅是创建查询。您将不得不以某种方式执行它。
  • 啊,谢谢 Eric,这很有帮助 - 我很感激你的解释!

标签: c# xml linq linq-to-xml


【解决方案1】:

我不确定 Eric 为何将他的答案发布为评论,但他是正确的。您的条件语句应为:

if (group.Any())

如果您的 XML 没有“组”标签,则 Any() 将评估为 false。

您可以将group 视为查询的所有匹配项的序列。在您的示例中,只有一个匹配项,但这仅意味着它是一个只有一个值的 IEnumerable。要获得该值,您可以执行以下操作:

string groupVal = group.FirstOrDefault();

这将返回第一个匹配项,如果没有匹配项,则返回空字符串。如果你希望只有一个结果,你可以使用Single(),如果有零个或多个结果,你想抛出一个异常。还有First()SingleOrDefault() 方法的行为与您预期的一样。

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多