【问题标题】:What is the best way to remove all instances from a Dictionary?从字典中删除所有实例的最佳方法是什么?
【发布时间】:2016-08-31 17:33:13
【问题描述】:

我有一本字典。对象的同一个实例可以分布在多个键上。我正在编写一个方法,以便您可以传递实例,并且该实例的所有键都将被删除。

以下工作,但我对 Linq 很弱。有更好的方法吗?我对优雅的代码很感兴趣,但我更关注速度。我怎样才能让这段代码运行得更快(不管删除是否成功,不删除)?

/// <summary>
/// Removes obstacle from the level, and returns true if the removal was successful
/// </summary>
public bool Remove(Obstacle obstacle)
{
    if (!obstacleMap.ContainsValue(obstacle))
    {
        return false;
    }
    foreach (var key in obstacleMap.Keys.Where(k => obstacleMap[k] == obstacle))
    {
        obstacleMap.Remove(key);
    }
    return true;
}

【问题讨论】:

标签: c# linq dictionary


【解决方案1】:

最快的方法可能是创建第二个字典,其中障碍物对象作为键,值将是第一个字典中引用该对象的键的列表。

您的字典现在的设置方式不适合您在Remove() 方法中尝试执行的操作。键查找比值查找快得多。

List<TKey> keys;
if (dict2.TryGetValue(obstacle, out keys))
{
    foreach (TKey key in keys)
    {
        obstacleMap.Remove(key);
    }

    dict2.Remove(obstacle);
}

记得在添加障碍物时更新两个字典。

【讨论】:

    【解决方案2】:

    试试这个:

    代替:

    foreach (var key in obstacleMap.Keys.Where(k => obstacleMap[k] == obstacle))
    {
        obstacleMap.Remove(key);
    }
    

    使用这个:

     var fObstacleMap = obstacleMap.Where(x => x.Value != obstacle).ToDictionary(y => y.Key, y => y.Value);
    

    这将创建另一个字典,没有障碍参数传递的对象,并且不抛出异常。

    【讨论】:

      【解决方案3】:

      这是一种更有效的方法,它还可以避免在枚举字典时从字典中删除项目时出现异常:

      public bool Remove(Obstacle obstacle)
      {
          var removeKeys = obstacleMap.Where(e => e.Value == obstacle).Select(e => e.Key).ToList();
          foreach (var key in removeKeys) obstacleMap.Remove(key);
          return removeKeys.Count > 0;
      }
      

      【讨论】:

        【解决方案4】:

        您也可以使用分组。不确定哪个性能更好。

        var newDictionary = dictionary.GroupBy(_ => _.Value)
                                      .Where(_ => _.Key != valueToRemove)
                                      .ToDictionary(_=> _.Single(), _ => _.Key);
        

        DotNetFiddle:https://dotnetfiddle.net/gRgCeX

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-07
          • 1970-01-01
          • 2021-12-14
          • 2010-09-09
          • 2011-05-31
          • 2010-10-12
          相关资源
          最近更新 更多