1

我有一本像这样的字典:

Dictionary<KeyValuePair<int, string>, OperationType> clickedList;

其中 OperationType 是一个枚举 { 下载、安装、删除、启用 }

我有另一个 KeyValuePair 列表,如下所示:

toRemove = machine.Array
                  .Select(x => 
                      new KeyValuePair<int, string>((int)x.MachineID, x.PackageID))
                  .ToList();

我需要执行以下操作:

  1. clickedList中删除所有存在于toRemoveOperationType 中的项目!= "Remove"
  2. clickedList中删除所有具有OperationType = "Remove"且不存在于toRemove列表中的项目。

有没有这样做的好方法?我该怎么做?

4

1 回答 1

2

我认为最有效的方法是使用 HashSet> 来存储实际上应该从字典中删除的所有键 - 尽管此解决方案不使用 linq:

toRemove = machine.Array
              .Select(x => 
                  new KeyValuePair<int, string>((int)x.MachineID, x.PackageID))
              .ToList();

// create a hash set and initially put all the elements from toRemove in the set
var r = new HashSet<KeyValuePair<int, string>>(toRemove);

// go over each element in the clickedList
//    and check whether it actually needs to be removed
foreach(var kvp in clickedList.Keys)      // O(n);  n = # of keys/elem. in dictionary
{
    if(kvp.Value == OperationType.Remove)
    {
       if(r.Contains(kvp.Key)             // O(1)
          r.Remove(kvp.Key);              //    (1)
       else
          r.Add(kvp.Key);                 //   O(1)
    }
}

foreach(var key in r)                     // O(m); m = # of keys to be removed 
{
    clickedList.Remove(key);
}

我相信上面可能是删除元素的最有效方法,因为它在字典中的键数量上是线性的。

于 2013-03-13T14:27:51.347 回答