代码已从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)部分。
答案 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。