更改自变量时枚举可能不会执行异常
Enumeration may not execute exception when changing an independent variable
我最近遇到了 Foreach 语句的问题,它在更改不应影响所枚举项目的变量时抛出 Collection was modified; enumeration operation may not execute
异常,但它仍然会影响。这是我的代码,所以我可以继续我的解释:
private static CEconTradeOffer RemoveUndesirables(CEconTradeOffer offer)
{
try
{
CEconTradeOffer returned = offer;
foreach (CEconAsset cEconAsset in offer.ItemsToReceive)
{
string marketHashName = cEconAsset.GetMarketHashName(_config.ApiKey);
if (marketHashName.ToLower().Contains("case") ||
marketHashName.Contains("gut") ||
marketHashName.Contains("falchion") ||
marketHashName.Contains("bayonet") ||
marketHashName.Contains("huntsman") ||
marketHashName.Contains("karambit") ||
marketHashName.Contains("butterfly"))
{
//somehow changes both "offer" and "returned" at once.
returned.ItemsToReceive.Remove(cEconAsset);
continue;
}
MarketValue value = MarketHandler.GetPriceOverview(Convert.ToUInt32(cEconAsset.AppId),
marketHashName);
if (!value.Success || int.Parse(value.Volume, NumberStyles.AllowThousands) <= 20)
returned.ItemsToReceive.Remove(cEconAsset);
}
return returned;
}
catch (Exception e)
{
Write.Exception(e);
return null;
}
}
此功能旨在完全按照其说明进行操作;从交易报价中删除不需要的项目。如您所见,我将 CEconTradeOffer returned
设置为等于传递的名为 offer
的相同类型的参数。奇怪的是,每当我更改 returned
内部的某些内容时,它都会导致 foreach
语句中断,即使我在技术上不应该以任何方式影响 offer.ItemsToReceive
。 returned
是应该修改的。当我使用调试器时,我注意到 returned
和 offer
都在 returned.ItemsToReceive.Remove(cEconAsset);
行发生了变化。根据我以前使用 C# 和浏览相关问题的经验,这不应该发生,因为我正在创建一个应该与 offer
分开的新变量。我试过将 returned
设置为 new CEconTradeOffer()
,然后将其设置为 offer
,但无济于事。在我对这个问题的研究中,我似乎只能找到人们无法在 foreach
语句而不是枚举值中创建新变量和修改它的问题。
我是否明显遗漏了什么?我不太明白为什么在 foreach
语句中创建一个单独的变量进行更改时会遇到这个特殊问题。
我没有使用多个线程,因此它不会受到其自身执行线程之外的影响。
提前致谢。
whenever I change something inside of returned
it causes the foreach
statement to break even though I technically shouldn't be impacting offer.ItemsToReceive
in any way.
好像CEconTradeOffer
是引用类型,那你赋值
CEconTradeOffer returned = offer;
你得到另一个完全相同的引用。
因此,当使用 returned.ItemsToReceive.Remove(cEconAsset)
删除项目时,它们会从同一个集合中删除,只是通过另一个引用。
我最近遇到了 Foreach 语句的问题,它在更改不应影响所枚举项目的变量时抛出 Collection was modified; enumeration operation may not execute
异常,但它仍然会影响。这是我的代码,所以我可以继续我的解释:
private static CEconTradeOffer RemoveUndesirables(CEconTradeOffer offer)
{
try
{
CEconTradeOffer returned = offer;
foreach (CEconAsset cEconAsset in offer.ItemsToReceive)
{
string marketHashName = cEconAsset.GetMarketHashName(_config.ApiKey);
if (marketHashName.ToLower().Contains("case") ||
marketHashName.Contains("gut") ||
marketHashName.Contains("falchion") ||
marketHashName.Contains("bayonet") ||
marketHashName.Contains("huntsman") ||
marketHashName.Contains("karambit") ||
marketHashName.Contains("butterfly"))
{
//somehow changes both "offer" and "returned" at once.
returned.ItemsToReceive.Remove(cEconAsset);
continue;
}
MarketValue value = MarketHandler.GetPriceOverview(Convert.ToUInt32(cEconAsset.AppId),
marketHashName);
if (!value.Success || int.Parse(value.Volume, NumberStyles.AllowThousands) <= 20)
returned.ItemsToReceive.Remove(cEconAsset);
}
return returned;
}
catch (Exception e)
{
Write.Exception(e);
return null;
}
}
此功能旨在完全按照其说明进行操作;从交易报价中删除不需要的项目。如您所见,我将 CEconTradeOffer returned
设置为等于传递的名为 offer
的相同类型的参数。奇怪的是,每当我更改 returned
内部的某些内容时,它都会导致 foreach
语句中断,即使我在技术上不应该以任何方式影响 offer.ItemsToReceive
。 returned
是应该修改的。当我使用调试器时,我注意到 returned
和 offer
都在 returned.ItemsToReceive.Remove(cEconAsset);
行发生了变化。根据我以前使用 C# 和浏览相关问题的经验,这不应该发生,因为我正在创建一个应该与 offer
分开的新变量。我试过将 returned
设置为 new CEconTradeOffer()
,然后将其设置为 offer
,但无济于事。在我对这个问题的研究中,我似乎只能找到人们无法在 foreach
语句而不是枚举值中创建新变量和修改它的问题。
我是否明显遗漏了什么?我不太明白为什么在 foreach
语句中创建一个单独的变量进行更改时会遇到这个特殊问题。
我没有使用多个线程,因此它不会受到其自身执行线程之外的影响。
提前致谢。
whenever I change something inside of
returned
it causes theforeach
statement to break even though I technically shouldn't be impactingoffer.ItemsToReceive
in any way.
好像CEconTradeOffer
是引用类型,那你赋值
CEconTradeOffer returned = offer;
你得到另一个完全相同的引用。
因此,当使用 returned.ItemsToReceive.Remove(cEconAsset)
删除项目时,它们会从同一个集合中删除,只是通过另一个引用。