#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 /…