Измените объект в списке объектов, используя foreach для меньшего списка тех же объектов - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь использовать foreach l oop для изменения значений в объектах в этом списке. Однако мне нужен один список, который не меняется, чтобы его перечислить, и основной список, который нужно изменить, когда я это сделаю. Независимо от того, что я пытаюсь, я сталкиваюсь с ошибкой, потому что он меняет объект в списке, который я перечисляю.

public static void GetHtml(Site website)
    {
        IEnumerable<Page> pages = new List<Page>();
        pages = website.PageList.Where(c => !c.Checked);
        WebClient client = new WebClient();
        foreach (Page page in pages)
        {
            try
            {
                page.Html = client.DownloadString(page.PageUrl);
                ParseHtml(page);
                ParseLinks(page, website);
                page.Valid = true;
                page.Checked = true;
            }
            catch
            {
                page.Valid = false;
                page.Checked = true;
            }
        }
    }

Объект сайта содержит список, в котором я хочу изменить значения объектов страницы , но мне не нужно изменять список страниц, которые я перечисляю. Я думал, что создание нового списка сработает, но, очевидно, нет.

1 Ответ

1 голос
/ 12 июля 2020

Попробуйте этот код, метод ToList () создаст новый список, который вы хотите

public static void GetHtml(Site website)
{
    // you don't need to instantiate a new List, because the after the next statement the variable pages will hold a different object
    // and the List you created will be garbage
    IEnumerable<Page> pages;
    // the .ToList() will instantiate a new List with all the results of the Where
    pages = website.PageList.Where(c => !c.Checked).ToList();
    WebClient client = new WebClient();
    foreach (Page page in pages)
    {
        try
        {
            page.Html = client.DownloadString(page.PageUrl);
            ParseHtml(page);
            ParseLinks(page, website);
            page.Valid = true;
            page.Checked = true;
        }
        catch
        {
            page.Valid = false;
            page.Checked = true;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...