C# 最佳实践-在C中从泛型集合中删除项#

C# 最佳实践-在C中从泛型集合中删除项#,c#,generics,.net-3.5,C#,Generics,.net 3.5,我在VisualStudio2008和.NET3.5中使用C# 我有一个通用字典,它将事件类型映射到订阅者的通用列表。订阅者可以订阅多个事件 private static Dictionary<EventType, List<ISubscriber>> _subscriptions; 备选案文2: ISubscriber subscriber; // defined elsewhere foreach (EventType event in _subscription

我在VisualStudio2008和.NET3.5中使用C#

我有一个通用字典,它将事件类型映射到订阅者的通用列表。订阅者可以订阅多个事件

private static Dictionary<EventType, List<ISubscriber>> _subscriptions;
备选案文2:

ISubscriber subscriber;  // defined elsewhere
foreach (EventType event in _subscriptions.Keys) {
    _subscriptions[event].Remove(subscriber);
}
我有两个问题

首先,请注意,选项1在删除项之前检查是否存在,而选项2使用暴力删除,因为Remove()不会引发异常。在这两种方法中,哪一种是首选的“最佳实践”方法

第二,是否有另一种“更干净”的方式来实现这一点,可能是使用lambda表达式或使用LINQ扩展?我仍在逐渐适应这两个特点

谢谢

编辑
为了澄清,我意识到选项1和选项2之间的选择是速度(选项2)和可维护性(选项1)的选择。在这种情况下,我不一定要优化代码,尽管这确实是一个值得考虑的问题。我想了解的是,是否有一个普遍公认的做法来做这件事。如果没有,您会在自己的代码中使用哪个选项?

选项1将比选项2慢。Lambda表达式和LINQ将更慢。我将使用
HashSet
而不是
List

如果您需要确认项目删除,则必须使用
Contains

编辑:
由于在
lock
语句中使用代码的概率很高,并且最佳做法是减少
lock
语句中的执行时间,因此应用选项2可能会很有用。似乎没有最佳实践可以使用或不使用
Contains
Remove

我选择第二个选项。Contains()和Remove()都是O(n)方法,没有理由同时调用这两个方法,因为Remove不会抛出。至少对于方法2,您只调用了一个昂贵的操作,而不是两个

我不知道有什么更快的方法来处理它。

Remove()方法“接近O(1)”,并且在不存在键时是可以的


但除此之外:当有疑问时,测量。获取一些时间安排并不是那么困难…

如果您想使用Linq来完成这项工作,我认为这会起作用(未经测试):


不过,您可能想检查这方面的性能。

当您只关心值时,为什么要枚举键

foreach (List<ISubscriber> list in _subscriptions.Values)
{
    list.Remove(subscriber);
}
foreach(在_subscriptions.Values中列出)
{
列表。删除(订户);
}

也就是说,Eric p提出的LINQ解决方案肯定更简洁。不过,性能可能是个问题。

已经有了一个字典:用哈希集替换列表(值)有什么好处?@LicenseQ:你说得对。我认为选项1和选项2之间的选择是速度与可维护性的选择。我正在寻找一种被普遍接受的方法,如果它存在的话。你们能详细说明为什么在列表上使用HashSet吗?DictionaryHashSet将加快包含和删除操作的速度——速度将等于Dictionary的速度。请看@LicenseQ:Yep上的ref,刚才看到了。List的Remove()为O(n),HashSet的Remove()为O(1)。谢谢很好。令人惊讶的是,有时你只能看到树木而看不到森林。谢谢
_subscriptions.Values.All(x => x.Remove(subscriber));
foreach (List<ISubscriber> list in _subscriptions.Values)
{
    list.Remove(subscriber);
}