Free cookie consent management tool by TermsFeed Policy Generator

source: branches/RemoveBackwardsCompatibility/HeuristicLab.ExtLibs/HeuristicLab.NRefactory/5.5.0/NRefactory-5.5.0/Utils/KeyComparer.cs @ 13346

Last change on this file since 13346 was 11700, checked in by jkarder, 10 years ago

#2077: created branch and added first version

File size: 3.3 KB
Line 
1// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4// software and associated documentation files (the "Software"), to deal in the Software
5// without restriction, including without limitation the rights to use, copy, modify, merge,
6// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7// to whom the Software is furnished to do so, subject to the following conditions:
8//
9// The above copyright notice and this permission notice shall be included in all copies or
10// substantial portions of the Software.
11//
12// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17// DEALINGS IN THE SOFTWARE.
18
19using System;
20using System.Collections.Generic;
21
22namespace ICSharpCode.NRefactory.Utils
23{
24  public static class KeyComparer
25  {
26    public static KeyComparer<TElement, TKey> Create<TElement, TKey>(Func<TElement, TKey> keySelector)
27    {
28      return new KeyComparer<TElement, TKey>(keySelector, Comparer<TKey>.Default, EqualityComparer<TKey>.Default);
29    }
30   
31    public static KeyComparer<TElement, TKey> Create<TElement, TKey>(Func<TElement, TKey> keySelector, IComparer<TKey> comparer, IEqualityComparer<TKey> equalityComparer)
32    {
33      return new KeyComparer<TElement, TKey>(keySelector, comparer, equalityComparer);
34    }
35   
36    public static IComparer<TElement> Create<TElement, TKey>(Func<TElement, TKey> keySelector, IComparer<TKey> comparer)
37    {
38      return new KeyComparer<TElement, TKey>(keySelector, comparer, EqualityComparer<TKey>.Default);
39    }
40   
41    public static IEqualityComparer<TElement> Create<TElement, TKey>(Func<TElement, TKey> keySelector, IEqualityComparer<TKey> equalityComparer)
42    {
43      return new KeyComparer<TElement, TKey>(keySelector, Comparer<TKey>.Default, equalityComparer);
44    }
45  }
46 
47  public class KeyComparer<TElement, TKey> : IComparer<TElement>, IEqualityComparer<TElement>
48  {
49    readonly Func<TElement, TKey> keySelector;
50    readonly IComparer<TKey> keyComparer;
51    readonly IEqualityComparer<TKey> keyEqualityComparer;
52   
53    public KeyComparer(Func<TElement, TKey> keySelector, IComparer<TKey> keyComparer, IEqualityComparer<TKey> keyEqualityComparer)
54    {
55      if (keySelector == null)
56        throw new ArgumentNullException("keySelector");
57      if (keyComparer == null)
58        throw new ArgumentNullException("keyComparer");
59      if (keyEqualityComparer == null)
60        throw new ArgumentNullException("keyEqualityComparer");
61      this.keySelector = keySelector;
62      this.keyComparer = keyComparer;
63      this.keyEqualityComparer = keyEqualityComparer;
64    }
65   
66    public int Compare(TElement x, TElement y)
67    {
68      return keyComparer.Compare(keySelector(x), keySelector(y));
69    }
70   
71    public bool Equals(TElement x, TElement y)
72    {
73      return keyEqualityComparer.Equals(keySelector(x), keySelector(y));
74    }
75   
76    public int GetHashCode(TElement obj)
77    {
78      return keyEqualityComparer.GetHashCode(keySelector(obj));
79    }
80  }
81}
Note: See TracBrowser for help on using the repository browser.