我有这个查询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()。"
我现在被贬低了。提前感谢您对此事的任何帮助。
答案 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);
}
提供的只有一个“转到结果的第一页”。