Linq:没有返回值导致异常

时间:2017-09-06 14:00:33

标签: c# linq

我有这个查询LINQ来抓取网页

string temp = statusLinkList[0].Descendants()
    .Where(x => (x.Name == "a" && x.Attributes["title"].Value.Contains("Go to the first page of results.")))
    .ToList()
    .First()
    .GetAttributeValue("href", null);

在某些情况下,查询不会返回任何记录,这会导致异常。在这种情况下我需要设置默认值。最合适的是使用" .DefaultIfEmpty()"。我无法实现这一点以避免异常并设置字符串temp的默认值。

string temp = statusLinkList[0].Descendants()
    .Where(x => (x.Name == "a" && x.Attributes["title"].Value.Contains("Go to the first page of results.")))
    .DefaultIfEmpty()
    .ToList()
    .First()
    .GetAttributeValue("href", null);

这里返回空列表" .ToList()。First()。"

我现在被贬低了。提前感谢您对此事的任何帮助。

2 个答案:

答案 0 :(得分:0)

首先,删除查询中的ToList。它无缘无故地在内存中创建临时列表。 其次,DefaultIfEmpty允许传递回退值,以防没有Where过滤的匹配项。然后First是安全的。

string hrefFallback = null;

string temp = statusLinkList[0].Descendants()
    .Where(x => x.Name == "a" && x.Attributes["title"].Value.Contains("Go to the first page of results."))
    .Select(x => x.GetAttributeValue("href", hrefFallback))
    .DefaultIfEmpty(hrefFallback)
    .First();

答案 1 :(得分:0)

您需要检查空列表。我会去:

var node statusLinkList[0].Descendants().Where(
    x => (x.Name == "a" && x.Attributes["title"].Value.Contains("Go to the first page of results."))).Single();
if (node!=null)
{
    string temp = node.GetAttributeValue("href", null);
}

提供的只有一个“转到结果的第一页”。