我有一组存储在editor.tabs
中的Tab对象。我试图删除列表中的每个选项卡,除了一个。这是我的代码现在的样子,并且由于显而易见的原因它不起作用:
// We need to make a copy of editor.tabs because other foreach fails
// since CloseTab actually removes tabs from editor.tabs.
// Basically, during the enumeration of a collection, that collection
// cannot change. So we just iterate over pointers instead.
List<Tab> tempList = new List<Tab>();
foreach (Tab tab in editor.tabs)
{
tempList.Add(tab);
}
foreach (Tab tab in tempList)
{
//Close everything but the current tab
if (tab != editor.currentTab)
{
CloseTab(tab);
}
}
editor.currentTab
已在CloseTab
内修改,因此询问tab = editor.currentTab
是否不是正确的问题。我们想要在第一次输入此函数时询问tab是否等于editor.currentTab
的值。
我考虑过制作editor.currentTab
的深层副本,但这感觉过分了。
当我们第一次输入函数然后将它与editor.currentTab
进行比较时,我还尝试计算tab.GetHashCode()
的哈希值,但这也不起作用。有没有人有任何想法?
编辑:
我刚才意识到这个bug存在于我的CloseTab功能中!哎呀!
答案 0 :(得分:2)
由于editor.currentTab
在每个标签关闭后发生变化,因此您应将其保存在循环之外:
Tab current = editor.currentTab;
foreach (Tab tab in tempList)
{
//Close everything but the current tab
if (tab != current)
{
CloseTab(tab);
}
}
此外,使用Linq,您可以更改您发布的所有代码:
editor.tabs.Where(t => t != editor.currentTab).ToList().Foreach(t => CloseTab(t));
答案 1 :(得分:0)
我认为在CloseTab()中你的代码逻辑存在一个基本缺陷,但是如果不能看到那个逻辑是什么,我只能推测。
我想在你进入关闭标签的所有逻辑之前,你想要保留的标签。一旦你有了你想要保留的标签的参考,那个参考不应该以任何方式改变,因为它是一个静态的想法,比如“嘿,我有一个苹果梨和香蕉,我想保留香蕉“,我们的逻辑看起来像这样:
FruitBasket basket = new FruitBasket() {new Fruit(apple), new Fruit(orange), new Fruit(banana)};
Fruit current = banana;
foreach (var fruit in basket)
{
if (fruit != current)
throw away fruit;
}
在这里你没有处理你要保留的水果,因为一旦你决定保留水果,你就会保持这个想法,直到你完成了所有其他的去除。如需更多帮助,我们需要查看CloseTab中的代码,以了解更改editor.currentTab的原因。