diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs index 2231d8638d..8792497609 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs @@ -304,43 +304,39 @@ End Property${Caret}", var merged = group.Snippets.Concat( defaultGroup.Snippets.Except( group.Snippets, - new PredicateComparer((x, y) => x.Name == y.Name, x => x.Name.GetHashCode()) - ).Select(s => new CodeSnippet(s)) + new ByMemberComparer(s => s.Name) + ).Select(s => new CodeSnippet(s)) // clone snippets so that defaultGroup is not modified ).OrderBy(s => s.Name).ToList(); group.Snippets.Clear(); group.Snippets.AddRange(merged); } } - foreach (var group in defaultSnippets.Except(savedSnippets, new PredicateComparer( - (x, y) => x.Extensions == y.Extensions, - x => x.Extensions.GetHashCode() - ))) { + foreach (var group in defaultSnippets.Except(savedSnippets, new ByMemberComparer(g => g.Extensions))) { savedSnippets.Add(group); } return savedSnippets; } - class PredicateComparer : IEqualityComparer + sealed class ByMemberComparer : IEqualityComparer { - Func equalsFunc; - Func getHashCodeFunc; + readonly Func selector; + readonly IEqualityComparer memberComparer = EqualityComparer.Default; - public PredicateComparer(Func equalsFunc, Func getHashCodeFunc) + public ByMemberComparer(Func selector) { - this.equalsFunc = equalsFunc; - this.getHashCodeFunc = getHashCodeFunc; + this.selector = selector; } - public bool Equals(T x, T y) + public bool Equals(TObject x, TObject y) { - return equalsFunc(x, y); + return memberComparer.Equals(selector(x), selector(y)); } - public int GetHashCode(T obj) + public int GetHashCode(TObject obj) { - return getHashCodeFunc(obj); + return memberComparer.GetHashCode(selector(obj)); } }