java等价的Iterator.remove在c#中

时间:2018-05-06 21:27:24

标签: 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.getU() < min)
            {
            iterItemset.remove();
            highU.decreaseCount();
            }
     }
}

C#代码:(转换后编写的代码)

foreach (List<ItemNY> level in highU.getLevels())
{
    ItemNY c;
    using (IEnumerator<ItemNY> iterItemset = level.GetEnumerator())
    {
        while (iterItemset.MoveNext())
        {
            c= iterItemset.Current;
            //CODE

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

            //END CODE

            if (c.getU() < min)
            {
                iterItemset.remove();  //ERROR
                highU.decreaseCount();
            }
        }
    }
}

我想从IEnumerator中删除一个项目,我该怎么做?

注意: C#部分编写的代码更完整,更多代码写入(CODE)到(END CODE)部分。

2 个答案:

答案 0 :(得分:0)

  

我想从IEnumerator中删除一个项目,我该怎么做?

简单:你没有。

我不懂Java,但这个想法在.NET中没有意义。正如您在the documentation中所读到的那样:

  

枚举器可用于读取集合中的数据,但不能用于修改基础集合。

如前所述,应直接使用foreach代替IEnumerator<T>

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

您必须将与过滤器匹配的元素放入新集合中,以便将其从level中删除。

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

答案 1 :(得分:0)

如果真正的目标是从列表中删除项目,那么我将使用List.RemoveAll,并定义要删除的条件。

如果您需要额外的计数器更新,则需要前后调整大小。尽管至少在目前的情况下并没有必要使用reduceCount方法,因为它似乎可以跟踪列表的大小,因此我将放弃该方法,并依赖于列表Count。