0

我有一个 Tab 对象的集合存储在editor.tabs. 我正在尝试从列表中删除除一个之外的每个选项卡。这是我的代码现在的样子,由于明显的原因它不起作用:

// 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(),但这也不起作用。有人有想法吗?

编辑:

我刚刚意识到这个错误在我的 CloseTab 函数中!哎呀!

4

2 回答 2

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));
于 2013-10-02T15:29:06.983 回答
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 的原因。

于 2013-10-02T16:07:43.163 回答