2013-10-02 40 views
0

我有一个存储在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()比较,但也没有工作。有人有想法吗?

编辑:

我只是意识到错误是在我CloseTab功能!哎呀!

+0

你在做什么'CloseTab'方法? – Habib

+0

有两件重要的事情:editor.currentTab指向一个位于editor.tabs中的Tab对象。我们从editor.tabs中删除这个Tab对象,然后将editor.currentTab重新分配给editor中的一个不同的Tab对象.tabs – Nick

+0

那么你在哪里存储对你想保留的标签的引用?我无法理解如果关闭Tab的条件是否与editor.currentTab不相等,editor.currentTab如何关闭。 –

回答

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)); 
+0

这其实是我尝试过的其他东西。但是现在不是当前只是一个指向editor.currentTab的指针(它在CloseTab中也发生了变化),这使我们无处可去吗? – Nick

+0

你可以发布'CloseTab(tab)'吗? –

+0

'现在不是当前只是一个指向editor.currentTab的指针'不,我不这么认为。 'current'在调用'CloseTab(tab);'之前指向'editor.currentTab'以前指向的“最初当前”选项卡。你试过这个,没有工作吗? –

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; 
} 

无处在此你chaning要保留哪些水果,因为一旦你决定要保持一个水果,你保持这个想法,直到你完成摆脱所有的其他。如需更多帮助,我们需要查看CloseTab中的代码,以了解更改editor.currentTab的原因。