0

に格納されている Tab オブジェクトのコレクションがありますeditor.tabs。1 つを除くすべてのタブをリストから削除しようとしています。私のコードは次のようになりますが、明らかな理由で機能しません。

// 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 が最初にこの関数に入ったときtab = editor.currentTabの値と等しいかどうかを尋ねたいと思います。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 に答える