管理更改集合

时间:2013-10-02 15:26:14

标签: c#

我有一组存储在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功能中!哎呀!

2 个答案:

答案 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的原因。