|
分類:[C#]
はじめまして
.Net Framework 4.6.1
下記ソースコードを実行すると、 foreachの2週目のタイミングで例外が発生してしまいます。
foreachに入る前にOutlineArticles.Count()を行ったり、 OutlineArticles.ToList()をforeachに渡したりすると例外は発生しないです。
調べていると遅延評価というのが問題っぽい感じがしているのですが、 ・.Count()をしたところでforeachで再評価されそうで、結果は変わらなそうなのになぜかうまくいく ・なぜforeach最初の1回目のループだけはうまくいくのか などまだまだ理解できておりません。
どなたかお詳しい方がいらっしゃいましたら、ご教授いただけませんでしょうか。
using HtmlAgilityPack; using System.Linq;
namespace IEnumerableTest { class Program { static void Main(string[] args) { string str = "< div class=\"ently_outline\">aaa</div><div class=\"ently_outline\">bbb</div><div class=\"ently_outline\">ccc</div><div class=\"ently_outline\">eee</div>"; HtmlDocument htmlDocument = new HtmlDocument(); htmlDocument.LoadHtml(str);
var OutlineArticles = from outline in htmlDocument.DocumentNode.SelectNodes("//div[@class='ently_outline']") select new { Html = outline.OuterHtml };
foreach (var outline in OutlineArticles) { htmlDocument.LoadHtml(outline.Html); } } } }
System.ArgumentOutOfRangeException HResult=0x80131502 Message=startIndex に文字列の長さより大きい値を指定することはできません。 パラメーター名:startIndex Source=mscorlib スタック トレース: 場所 System.String.Substring(Int32 startIndex, Int32 length) 場所 HtmlAgilityPack.HtmlNode.get_OuterHtml() 場所 HtmlAgilityPack.HtmlNode.WriteTo(TextWriter outText, Int32 level) 場所 HtmlAgilityPack.HtmlNode.WriteContentTo(TextWriter outText, Int32 level) 場所 HtmlAgilityPack.HtmlNode.WriteContentTo() 場所 HtmlAgilityPack.HtmlNode.get_OuterHtml() 場所 IEnumerableTest.Program.<>c.<Main>b__0_0(HtmlNode outline) 場所 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 場所 IEnumerableTest.Program.Main(String[] args)
|