C# 列表<;字符串>;不删除项目
我正在编写一个调用跟踪应用程序,它是一个推送服务器,并获得传入调用的JSON结果集。在JSON对象中,有一个键数组,其中包含每个调用的logID 当一个新的调用传入时,我创建一个新的选项卡页面,并将一个调用对象与tab pages标记属性相关联。然后检查调用是否已被处理,推送服务器是否已从密钥数组中删除logID。然后,我将Keys数组中的logid与每个call对象的logid进行比较,每个call对象都与每个打开的选项卡相关联 当运行我的代码时,它会从_psKeys列表中删除logID,但在下一次迭代中会将其添加回。有人能告诉我我做错了什么吗C# 列表<;字符串>;不删除项目,c#,json,list,C#,Json,List,我正在编写一个调用跟踪应用程序,它是一个推送服务器,并获得传入调用的JSON结果集。在JSON对象中,有一个键数组,其中包含每个调用的logID 当一个新的调用传入时,我创建一个新的选项卡页面,并将一个调用对象与tab pages标记属性相关联。然后检查调用是否已被处理,推送服务器是否已从密钥数组中删除logID。然后,我将Keys数组中的logid与每个call对象的logid进行比较,每个call对象都与每个打开的选项卡相关联 当运行我的代码时,它会从_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);
}
}
}
}
}
您正在修改迭代的几个集合。这从来不是个好主意 此外,就循环的逻辑而言,您似乎没有在psKeys上进行任何迭代。应该是这样的:
foreach (string tabKey in _tabKeys)
{
if (! _psKeys.Contains(tabKey))
{
//Remove the tab
//...
}
}
您不应该从正在枚举的列表中删除项。首先,我不想添加它们
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));
您可以使用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));
}
这在codereview StackExchangeE上会更好我应该使用什么来保存logId并比较它们?数组是更好的选择吗?即使我删除了从_tabKeys列表中删除该项的行,列表也会被清除并从JSON结果中自动填充,并提供相同的结果。我只是稍微编辑了一下。很难从上下文中知道发生了什么。这对我来说似乎有点复杂,你太棒了!谢谢你,工作起来很有魅力…只是需要在if语句之外创建Call对象。我喜欢第二个选项,但它不起作用。TabPage上没有Where方法?这将无法正常工作。由于LINQ的懒惰特性,当您从中删除项时,您仍然在迭代_tabKeys。您需要在每个LINQ链的末尾调用
.ToList()
,以将删除列表与原始列表解耦。@Andrew-谢谢,很高兴知道。我更新了我的答案。
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));
}