Как мне реализовать resharper, подобный сопоставлению camelhumps?

#c#

#c#

Вопрос:

Как мне реализовать resharper, подобный сопоставлению camelhumps?

Я начал с этого:

ПРИМЕЧАНИЕ: на этом рисунке показаны слова, разделенные пробелами, но алгоритм, который я написал, также будет работать с верблюжьими горбами, разделяя слова при переходе из нижнего регистра в верхний (путем добавления пробела). Он также будет работать с символами подчеркивания, заменяя их пробелом.

введите описание изображения здесь

До сих пор я использовал алгоритм оценки для определения порядка совпадений.

Но в основном мой ограничен либо полным совпадением, совпадением по первым символам, либо совпадением подстроки.

Я думаю, что resharper также допускает более сложные вещи, просто интересно, существуют ли какие-либо известные полезные алгоритмы для такого сопоставления.

    /// <summary>
   /// This returns how good of a match something is using camelhumps.
   /// 0 = not a match
   /// 1 = exact match
   /// 2 = exact match no whitespace
   /// 3 = camel humps match on first character
   /// 4 = substring
   /// </summary>
   /// <returns></returns>
   private int GetMatchRanking( string value, string filter )
   {
      if ( filter.ToLower() == value.ToLower() ) return 1;
      if ( filter.RemoveAllWhitespace().ToLower() == value.RemoveAllWhitespace().ToLower() ) return 2;
      // Camel matching on first letters only: touch last changeset ==> tlc
      if ( filter.ToLower() == GetFirstLettersForFiltering( value ) ) return 3;
      if ( value.ToLower().Contains( filter.ToLower() ) ) return 4;
      return 0;
   }

   // Define other methods and classes here
   public List<string> CamelSplit( string s )
   {
      string text = Regex.Replace( s, @"([a-z])([A-Z])", "$1 $2" );
      text = text.Replace( "_", " " ).Trim().ToLower();
      return text.Split( " ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries ).ToList();
   }

   public string GetFirstLetters( List<string> strings )
   {
      return string.Join( "", strings.Select( s => s.Substring( 0, 1 ) ) );
   }

   public string GetFirstLettersForFiltering( string s )
   {
      string letters = GetFirstLetters( CamelSplit( s ) );
      if( letters.Length <= 1 || letters.Contains( "<" ) ) return null;
      return letters;
   }
  

Комментарии:

1.Я думаю, вы могли бы попробовать lucene.net в вашем проекте: lucenetutorial.com/lucene-in-5-minutes.html codeproject.com/Articles/320219 /…