Browse Source

WeakCollection<T>: use Equals() in Remove() implementation. This is necessary to make the use as WeakCollection<EventHandler> work as expected.

pull/375/head
Daniel Grunwald 12 years ago
parent
commit
4e35d331dc
  1. 4
      src/Main/Core/Project/Src/Util/CommandWrapper.cs
  2. 20
      src/Main/Core/Project/Src/Util/WeakCollection.cs

4
src/Main/Core/Project/Src/Util/CommandWrapper.cs

@ -160,6 +160,8 @@ namespace ICSharpCode.Core @@ -160,6 +160,8 @@ namespace ICSharpCode.Core
public event EventHandler CanExecuteChanged {
add {
if (value == null)
return;
if (conditions.Count > 0 && RegisterConditionRequerySuggestedHandler != null)
RegisterConditionRequerySuggestedHandler(value);
@ -169,6 +171,8 @@ namespace ICSharpCode.Core @@ -169,6 +171,8 @@ namespace ICSharpCode.Core
canExecuteChangedHandlersToRegisterOnCommand.Add(value);
}
remove {
if (value == null)
return;
if (conditions.Count > 0 && UnregisterConditionRequerySuggestedHandler != null)
UnregisterConditionRequerySuggestedHandler(value);

20
src/Main/Core/Project/Src/Util/WeakCollection.cs

@ -61,21 +61,6 @@ namespace ICSharpCode.Core @@ -61,21 +61,6 @@ namespace ICSharpCode.Core
CheckNoEnumerator();
}
/// <summary>
/// Checks if the collection contains an item. Runtime: O(n).
/// </summary>
public bool Contains(T item)
{
if (item == null)
throw new ArgumentNullException("item");
CheckNoEnumerator();
foreach (T element in this) {
if (item.Equals(element))
return true;
}
return false;
}
/// <summary>
/// Removes an element from the collection. Returns true if the item is found and removed,
/// false when the item is not found.
@ -84,13 +69,14 @@ namespace ICSharpCode.Core @@ -84,13 +69,14 @@ namespace ICSharpCode.Core
public bool Remove(T item)
{
if (item == null)
throw new ArgumentNullException("item");
return false;
CheckNoEnumerator();
var comparer = EqualityComparer<T>.Default;
for (int i = 0; i < innerList.Count;) {
T element = (T)innerList[i].Target;
if (element == null) {
RemoveAt(i);
} else if (element == item) {
} else if (comparer.Equals(element, item)) {
RemoveAt(i);
return true;
} else {

Loading…
Cancel
Save