2

私はこのコードを持っています:

private void ToLocalSiteOnlyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (buttonSwitch == true)
            {
                ToLocalSiteOnlyToolStripMenuItem.ForeColor = Color.Red;
                buttonSwitch = false;
                removeExt = true;
            }
            else
            {
                ToLocalSiteOnlyToolStripMenuItem.ForeColor = Color.Black;
                buttonSwitch = true;
                removeExt = false;
            }
        }



private void removeExternals(List<string> externals)
    {

        for (int i = 0; i < externals.Count; i++)
        {
            if (!externals[i].StartsWith(mainUrl))
            {
                externals.RemoveAt(i);
            }
        }
    }

メニューとその赤をクリックすると、ここで関数removeExternalsを呼び出します。

private List<string> test(string url, int levels,DoWorkEventArgs eve)
        {

            HtmlWeb hw = new HtmlWeb();
            List<string> webSites;
            try
            {
                doc = hw.Load(url);
                webSites = getLinks(doc);
                removeDupes(webSites);
                if (removeExt == true)
                {
                    removeExternals(webSites);
                }

これで、webSitesリストには次のようなサイトのリンクが含まれます。

www.ynet.co.il
www.hot.co.il
www.walla.co.il

これで、変数mainUrlはhttp://www.ynet.co.il になります。テスト関数を呼び出すたびに、webSitesに異なるリンクのリストを設定して、http://wwwで始まらないすべてのリンクを削除します。 .ynet.co.il

したがって、最終的には、毎回、次で始まるリンクのみがWebサイトに表示されます: http://www.ynet.co.il

しかし、removeExternals関数が思ったようにうまく機能していないようです。

問題はどこにあり、どのように修復するのですか?ありがとう。

4

3 に答える 3

2

問題はあなたのループにあります:

  for (int i = 0; i < externals.Count; i++)
  {
      if (!externals[i].StartsWith(mainUrl))
      {
          externals.RemoveAt(i);
      }
  }

を呼び出すたびRemoveAt()に、すべてのインデックスを変更します。を呼び出すとRemoveAt(1)、1以降のすべてが下にシフトされます。次のように、逆の順序でループすることをお勧めします。

  for (int i = externals.Count - 1; i >= 0; i--)
  {
      if (!externals[i].StartsWith(mainUrl))
      {
          externals.RemoveAt(i);
      }
  }
于 2012-09-17T03:08:28.307 に答える
2

問題の理由についてMikeChristensenに同意します。これは、ループする代わりに私がお勧めするものです:

externals.RemoveAll(s => s.StartsWith(mainUrl));

removeExternalsメソッドをこの行に置き換えることができます。

于 2012-09-17T03:12:32.107 に答える
0

私が最初に気付くのは、removeExternalsメソッドがゼロ要素からアイテムを削除していることです。これは、インデックス付きの削除によって番号付きの要素が変わるため、誤った削除につながる可能性があります。この問題を解決するには、ループを逆にして最後から最初に移動します。これにより、削除が正しい順序で行われることが保証されます。

于 2012-09-17T03:10:04.603 に答える