List< String>不移除物品

本文关键字:String List | 更新日期: 2023-09-27 18:04:00

我正在编写一个呼叫跟踪应用程序,它命中一个推送服务器,并获得传入呼叫的JSON结果集。在JSON对象中,有一个key数组,其中包含每个调用的logID。

当一个新的调用进来时,我创建一个新的选项卡页,并将调用对象与选项卡页标记属性相关联。然后检查调用是否已被置换,如果有,则推送服务器将从Keys数组中删除logID。然后,我将Keys数组中的logid与每个调用对象的logid进行比较,这与每个打开的选项卡相关联。

当运行我的代码时,它从_psKeys列表中删除logID,但随后在下一次迭代中将其添加回来。谁能告诉我我哪里做错了?

        var jsonResult = _pushServer.GetWebRequest(_pushServer.GetNewCallUrl(_locationID, _clientID));
        var jsonObject = _pushServer.GetJsonObject(jsonResult);
        _tabKeys.Clear();
        _psKeys.Clear();
        // Load the tabKeys with all the keys for the open tabs.
        foreach (TabPage tab in newCallTabControl.TabPages)
        {
            Call call = (Call)tab.Tag;
            _tabKeys.Add(call.LogID);                
        }
        // Load the Push Server Keys
        foreach (string key in jsonObject.keys)
        {
            _psKeys.Add(key);                
        }
        // Iterate over the keys and compare
        foreach (string tabKey in _tabKeys)
        {
            foreach (string psKey in _psKeys)
            {
                if (! _tabKeys.Contains(psKey))
                {
                    // Remove the tab
                    foreach (TabPage tabPage in newCallTabControl.TabPages)
                    {
                        Call tabCallObject = (Call)tabPage.Tag;
                        if (tabCallObject.LogID == tabKey)
                        {
                            newCallTabControl.TabPages.Remove(tabPage);                        
                        }
                    }
                }                    
            }                
        }

List< String>不移除物品

你不应该从你枚举的列表中删除项目。我一开始就不会添加它们....

    var jsonResult = _pushServer.GetWebRequest(_pushServer.GetNewCallUrl(_locationID, _clientID));
    var jsonObject = _pushServer.GetJsonObject(jsonResult);
    _tabKeys.Clear();
    _psKeys.Clear();
// Load the Push Server Keys
    foreach (string key in jsonObject.keys)
    {
        _psKeys.Add(key);                
    }
    var tabsToRemove = new List<TabPage>();
// Load the tabKeys with all the keys for the open tabs.
    foreach (TabPage tab in newCallTabControl.TabPages)
    {
        Call call = (Call)tab.Tag;
        if(_psKeys.Contains(call.LogID)
        {               
          _tabKeys.Add(call.LogID); 
        }               
        else
        {
          tabsToRemove.Add(tab)
        }
    }
    tabsToRemove.ForEach(t => newCallTabControl.TabPages.Remove(t));

或者如果你不需要列表…

var tabsToRemove = newCallTabControl.TabPages
          .Where(tab => !jsonObject.keys.Contains(((Call)tab.tag).LogID))
          .ToList();
tabsToRemove.ForEach(t => newCallTabControl.TabPages.Remove(t)); 

您可以使用Linq获取需要操作的数据,然后分别执行操作:

var tabKeysToRemove = _tabKeys.Where(t => !_psKeys.Contains(t)).ToList();
foreach (var tabKey in tabKeysToRemove)
{
    _tabKeys.Remove(tabKey);
    var tabsToRemove = newCallTabControl.TabPages
        .Where(tp => ((Call)tp.Tag).logID == tabKey).ToList();
    tabsToRemove.forEach(t => newCallTabControl.TabPages.Remove(t));
}

您正在修改几个要迭代的集合。这可不是个好主意。

此外,就循环的逻辑而言,您似乎没有对_psKeys的迭代做任何事情。应该是这样的:

foreach (string tabKey in _tabKeys)        
{            
    if (! _psKeys.Contains(tabKey))
    {
        //Remove the tab
        //...
    }
}