Browse Source

Refactor InsertResult

We now use BinarySearch in all cases to perform sorted insertion
pull/2335/head
MikeFH 4 years ago
parent
commit
974bdd1804
  1. 19
      ILSpy/ExtensionMethods.cs
  2. 30
      ILSpy/Search/SearchPane.cs
  3. 14
      ILSpy/Search/SearchResult.cs

19
ILSpy/ExtensionMethods.cs

@ -93,6 +93,25 @@ namespace ICSharpCode.ILSpy @@ -93,6 +93,25 @@ namespace ICSharpCode.ILSpy
}
return ~start;
}
public static void InsertSorted<T>(this IList<T> list, T item, IComparer<T> comparer)
{
if (list == null)
throw new ArgumentNullException(nameof(list));
if (comparer == null)
throw new ArgumentNullException(nameof(comparer));
if (list.Count == 0)
{
list.Add(item);
}
else
{
int index = list.BinarySearch(item, 0, list.Count, comparer);
list.Insert(index < 0 ? ~index : index, item);
}
}
/*
public static bool IsCustomAttribute(this TypeDefinition type)
{

30
ILSpy/Search/SearchPane.cs

@ -34,6 +34,7 @@ using System.Windows.Threading; @@ -34,6 +34,7 @@ using System.Windows.Threading;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.Docking;
using ICSharpCode.ILSpy.Options;
using ICSharpCode.ILSpy.Search;
using ICSharpCode.ILSpy.ViewModels;
@ -253,30 +254,11 @@ namespace ICSharpCode.ILSpy @@ -253,30 +254,11 @@ namespace ICSharpCode.ILSpy
void InsertResult(IList<SearchResult> results, SearchResult result)
{
if (results.Count == 0)
{
results.Add(result);
}
else if (Options.DisplaySettingsPanel.CurrentDisplaySettings.SortResults)
{
// Keep results collection sorted by "Fitness" by inserting result into correct place
// Inserts in the beginning shifts all elements, but there can be no more than 1000 items.
for (int i = 0; i < results.Count; i++)
{
if (results[i].Fitness < result.Fitness)
{
results.Insert(i, result);
return;
}
}
results.Add(result);
}
else
{
// Original Code
int index = results.BinarySearch(result, 0, results.Count - 1, SearchResult.Comparer);
results.Insert(index < 0 ? ~index : index, result);
}
var comparer = DisplaySettingsPanel.CurrentDisplaySettings.SortResults ?
SearchResult.ComparerByFitness :
SearchResult.ComparerByName;
results.InsertSorted(result, comparer);
}
void JumpToSelectedItem()

14
ILSpy/Search/SearchResult.cs

@ -29,7 +29,8 @@ namespace ICSharpCode.ILSpy @@ -29,7 +29,8 @@ namespace ICSharpCode.ILSpy
{
public class SearchResult
{
public static readonly IComparer<SearchResult> Comparer = new SearchResultComparer();
public static readonly IComparer<SearchResult> ComparerByName = new SearchResultNameComparer();
public static readonly IComparer<SearchResult> ComparerByFitness = new SearchResultFitnessComparer();
public virtual object Reference {
get {
@ -57,13 +58,22 @@ namespace ICSharpCode.ILSpy @@ -57,13 +58,22 @@ namespace ICSharpCode.ILSpy
return Name;
}
class SearchResultComparer : IComparer<SearchResult>
class SearchResultNameComparer : IComparer<SearchResult>
{
public int Compare(SearchResult x, SearchResult y)
{
return StringComparer.Ordinal.Compare(x?.Name ?? "", y?.Name ?? "");
}
}
class SearchResultFitnessComparer : IComparer<SearchResult>
{
public int Compare(SearchResult x, SearchResult y)
{
//elements with higher Fitness come first
return Comparer<float>.Default.Compare(y?.Fitness ?? 0, x?.Fitness ?? 0);
}
}
}
public class MemberSearchResult : SearchResult

Loading…
Cancel
Save