簡體   English   中英

c#中的java等效Iterator.remove

[英]java equivalent Iterator.remove in 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)部分。

我想從 IEnumerator 中刪除一個項目,我該怎么做?

很簡單:你沒有。

我不懂 Java,但這個想法在 .NET 中沒有意義。 正如您在文檔中所讀到

枚舉器可用於讀取集合中的數據,但不能用於修改底層集合。

正如還提到的,應該直接使用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);
    } 
}

如果真正的目標是從列表中刪除項目,那么我將使用List.RemoveAll ,並使用條件定義要刪除的項目。

如果您需要額外的計數器更新,那么您可以在前后取一個尺寸。 盡管至少在目前的情況下不需要減少計數方法,因為它似乎跟蹤列表的大小,所以我會放棄該方法,並依賴列表計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM