我正在编写一个呼叫跟踪应用程序,该应用程序命中了一个推送服务器,并获得了已进入的调用的JSON结果集。在JSON对象中,有一组Keys包含每个调用的logID。
当一个新的调用进来时,我创建一个新的标签页并将一个调用对象与标签页标签属性相关联。然后我检查一个调用是否已被处置,如果它有推送服务器从Keys数组中删除logID。然后我将Keys数组中的logIds与每个调用对象的logIds进行比较,该logIds与每个打开的选项卡相关联。
运行我的代码时,它会从_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);
}
}
}
}
}
答案 0 :(得分:1)
您不应该从列举的列表中删除项目。我不会在第一时间添加它们....
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));
答案 1 :(得分:1)
您可以使用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));
}
答案 2 :(得分:0)
你正在修改你正在迭代的几个集合。这绝不是一个好主意。
另外,就你的循环逻辑而言,你似乎没有对_psKeys的迭代做任何事情。应该是这样的:
foreach (string tabKey in _tabKeys)
{
if (! _psKeys.Contains(tabKey))
{
//Remove the tab
//...
}
}