Skip to content
This repository has been archived by the owner on Oct 16, 2020. It is now read-only.

Commit

Permalink
Simplify SnippetManager.LoadGroups, hopefully fixes http://community.…
Browse files Browse the repository at this point in the history
  • Loading branch information
dgrunwald committed Aug 29, 2010
1 parent df5780e commit b271d6b
Showing 1 changed file with 12 additions and 16 deletions.
Expand Up @@ -304,43 +304,39 @@ public List<CodeSnippetGroup> LoadGroups()
var merged = group.Snippets.Concat(
defaultGroup.Snippets.Except(
group.Snippets,
new PredicateComparer<CodeSnippet>((x, y) => x.Name == y.Name, x => x.Name.GetHashCode())
).Select(s => new CodeSnippet(s))
new ByMemberComparer<CodeSnippet, string>(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<CodeSnippetGroup>(
(x, y) => x.Extensions == y.Extensions,
x => x.Extensions.GetHashCode()
))) {
foreach (var group in defaultSnippets.Except(savedSnippets, new ByMemberComparer<CodeSnippetGroup, string>(g => g.Extensions))) {
savedSnippets.Add(group);
}

return savedSnippets;
}

class PredicateComparer<T> : IEqualityComparer<T>
sealed class ByMemberComparer<TObject, TMember> : IEqualityComparer<TObject>
{
Func<T, T, bool> equalsFunc;
Func<T, int> getHashCodeFunc;
readonly Func<TObject, TMember> selector;
readonly IEqualityComparer<TMember> memberComparer = EqualityComparer<TMember>.Default;

public PredicateComparer(Func<T, T, bool> equalsFunc, Func<T, int> getHashCodeFunc)
public ByMemberComparer(Func<TObject, TMember> 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));
}
}

Expand Down

0 comments on commit b271d6b

Please sign in to comment.