【问题标题】:How to detect whether an item in deleted in this scenario在这种情况下如何检测项目是否已删除
【发布时间】:2013-05-29 15:40:00
【问题描述】:

我有一个场景,在一个连续运行的线程中,“计时器”调用我的函数“自定义方法”。我无法控制系统代码,这只是为了演示系统是如何工作的,我什至不知道 系统代码 中编写了哪些代码。

系统代码

   timer duration = 1000
    void timer_elapsed()
    {
          foreach(string symbol in symbols) //symbol list may vary
          {
               custommethod(symbol);
          } 
    }

结束系统代码

所以,我的方法“custommethod”只是定期从系统代码中获取一个参数。当用户添加或删除由系统代码处理的符号时,符号列表可能会有所不同。我得到的只是周期性的活动符号。所以,我关心的是保留一个活动符号列表。

我的代码

function custommethod(string symbol)
{
      //Check whether new symbol is added or a symbol is deleted
}

结束我的代码

这是我迄今为止尝试过的

    HashTable ht=new HashTable();
    function custommethod(string symbol)
    {
          //Check whether new symbol is added or a symbol is deleted
            if(!ht.ContainsKey(symbol))
            {
                ht.Add(symbol,0);  //New symbol added
            }
          //How will i come to know whether a symbol is deleted or not
    }

【问题讨论】:

  • 有没有办法让你知道timer_elapsed是否已经发生?
  • 定时器总是1秒吗?如果是这样,您可以存储 DateTime。现在您将符号输入 HashTable,然后在每次获得新符号时检查它是否过期。
  • 不,实际上我使用 Windows 消息发送消息到系统代码,然后调用带有活动符号的 custommethod 函数
  • 所以您知道/控制流程何时开始?如果是这样,在发送消息之前,您可以清除 HashTable。这样您就知道您拥有最新的符号列表。还是我错过了什么?
  • 好的。那么当你启动进程并填充它时,你能创建一个新的临时哈希表吗?那你可以做个对比吗?

标签: c# asp.net vb.net winforms c#-4.0


【解决方案1】:

如果htsymbols 相同,那就不好了。永远不要改变foreach 循环的来源。

如果是这种情况,您应该生成一个新集合,然后用旧集合替换它。

【讨论】:

  • 正如我告诉你的,我对系统代码一无所知。这只是为了简化事情。
【解决方案2】:

我不会使用“for each”方法,而是使用 HashSet 在新集和旧集之间进行设置比较(尽管大部分是 Linq,所以 HashTable 可以,IDK)

HashSet oldSet;//construct that correctly
HashSet newSet;//construct that correctly also
HashSet deletedSet = oldSet.Except(newSet);
HashSet addedSet = newSet.Except(oldSet);

【讨论】:

  • 我认为这里的问题是 foreach 是固定的。他没有办法修改那部分。
  • @ChrisO 那么他就是 SOL,因为如果他永远不知道集合的结束(边界),他就无法确定集合的差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多