通过在较小的相同对象列表上使用 foreach 来更改对象列表中的对象
Change an object in a list of objects by using foreach over a smaller list of the same objects
我正在尝试使用 foreach 循环来更改该列表中对象的值。但是,我需要一个不会更改的列表来枚举,并且在我这样做时更改主列表。无论我尝试什么,我 运行 都会出错,因为它正在更改我正在枚举的列表中的对象。
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;
}
}
}
站点对象包含一个列表,我想在其中修改页面对象的值,但我不需要修改我正在枚举的页面列表。我以为实例化一个新列表就可以完成这项工作,但显然不行。
试试这段代码,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;
}
}
}
我正在尝试使用 foreach 循环来更改该列表中对象的值。但是,我需要一个不会更改的列表来枚举,并且在我这样做时更改主列表。无论我尝试什么,我 运行 都会出错,因为它正在更改我正在枚举的列表中的对象。
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;
}
}
}
站点对象包含一个列表,我想在其中修改页面对象的值,但我不需要修改我正在枚举的页面列表。我以为实例化一个新列表就可以完成这项工作,但显然不行。
试试这段代码,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;
}
}
}