c中的java等效迭代器.remove#
代码已从Java迁移到C# Java代码:c中的java等效迭代器.remove#,java,c#,Java,C#,代码已从Java迁移到C# Java代码: for (List<ItemNY> level : highU.getLevels()) { Iterator<ItemNY> iterItemset = level.iterator(); while(iterItemset.hasNext()) { ItemNY c = iterItemset.next(); // Code... if(c.get
for (List<ItemNY> level : highU.getLevels())
{
Iterator<ItemNY> iterItemset = level.iterator();
while(iterItemset.hasNext())
{
ItemNY c = iterItemset.next();
// Code...
if(c.getU() < min)
{
iterItemset.remove();
highU.decreaseCount();
}
}
}
for(列表级别:highU.getLevels())
{
迭代器iterItemset=level.Iterator();
while(iterItemset.hasNext())
{
ItemNY c=iterItemset.next();
//代码。。。
如果(c.getU()
C#代码:(转换后编写的代码)
foreach(在highU.getLevels()中列出级别)
{
第c项;
使用(IEnumerator iterItemset=level.GetEnumerator())
{
while(iterItemset.MoveNext())
{
c=iterItemset.电流;
//代码
foreach(数据库中的TransactionTP transaction.getTransactions())
{
int transactionUtility=0;
int matchescont=0;
对于(int i=0;i
我想从IEnumerator中删除一个项目,如何执行此操作
注意:在C#部分编写的代码更完整,在(代码)到(结束代码)部分编写的代码更多
我想从IEnumerator中删除一个项目,如何执行此操作
简单:你没有
我不懂Java,但这种想法在.NET中没有意义。正如您在中所读到的:
枚举数可用于读取集合中的数据,但不能用于修改基础集合
如前所述,foreach
应直接使用,而不是IEnumerator
:
foreach (List<ItemNY> level in highU.getLevels())
{
foreach (var item in level)
{
if (item.getU() < min)
{
level.Remove(item); //Error, you are modifying a collection being enumerated
highU.decreaseCount();
}
}
}
如果真正的目标是从列表中删除项,那么我将使用,并使用条件定义要删除的项
如果您需要额外的计数器更新,那么您可以在更新前后选择一个大小。虽然至少在本例中不需要decreaseCount方法,因为它似乎跟踪列表的大小,所以我会放弃该方法,并依赖列表计数。使用列表并从中删除该项。不需要自己使用迭代器。将整个循环体替换为
foreach(level.Where(lvl=>lvl.getU()
真的,java允许你这么做吗?迭代器迭代项,但不包含项。所以从迭代器中删除项是没有意义的。。。您实际上不需要显式调用GetEnumerator,您可以使用foreach对项进行迭代,迭代列表的副本,以便您可以从原始列表中删除项。IEnumerable
和IEnumerable
接口的契约——以及它们的通用对应项——明确禁止在迭代过程中修改基础序列(尽管您可以创建自己的实现来允许它),如果在枚举过程中修改了基础序列,则将引发异常。正如@SelmanGenç所写的,您需要复制序列,迭代副本,并从原始序列中删除内容。或者,您可以先迭代原始文件,将要删除的内容保存在另一个结构中,然后从原始文件中删除这些内容。感谢所有人提供完整的指导。不幸的是,出现了另一个问题。在循环中,我有其他依赖于该结构的代码。(//Code…)定义了ItemNY类型的C变量,有C.method1()、C.method2()、。当我没有ItemNY类型的变量时,如何使用这些方法?非常感谢much@Reza如果你编辑你的问题并把它包括进来,我也许能帮上忙,但只有那句话,问题就不存在了variable@Reza更新后,你的评论超出了我的工作时间:)我真的很惭愧。明天我将交付这个项目(从Java到C的迁移)。所以我很匆忙地回答你:)。我收到一个错误。错误为:“没有给定的参数与'List.RemoveRange(int,int)'的必需形式参数'count'相对应”
foreach (List<ItemNY> level in highU.getLevels())
{
foreach (var item in level)
{
if (item.getU() < min)
{
level.Remove(item); //Error, you are modifying a collection being enumerated
highU.decreaseCount();
}
}
}
foreach (List<ItemNY> level in highU.getLevels())
{
var filteredItems = new List<ItemNY>();
foreach (var c in level)
{
foreach (TransactionTP transaction in database.getTransactions())
{
int transactionUtility = 0;
int matchesCount = 0;
for (int i = 0; i < transaction.size(); i++)
{
if (c.getItems().Contains(transaction.get(i).item))
{
transactionUtility += transaction.getItemsUtilities()[i].utility;
matchesCount++;
}
}
if (matchesCount == c.size())
{
c.incrementUtility(transactionUtility);
}
}
if (c.getU() < min)
{
filteredItems.Add(c);
highU.decreaseCount();
}
}
foreach (var item in filteredItems)
{
level.Remove(item);
}
}