c中的java等效迭代器.remove#

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

代码已从Java迁移到C#

Java代码:

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);
    } 
}