Поиск строки для конкретного слова. C # - PullRequest
1 голос
/ 05 февраля 2011

Я хотел бы найти строку для определенных слов, которые пользователь мог бы ввести, а затем вывести процентное содержание этого слова в тексте.Просто интересно, какой будет лучший метод для этого, и не могли бы вы мне помочь, пожалуйста.

Ответы [ 4 ]

3 голосов
/ 05 февраля 2011

Я предлагаю использовать String.Equals перегрузку с StringComparison, указанным для лучшей производительности.

var separators = new [] { ' ', ',', '.', '?', '!', ';', ':', '\"' };
var words = sentence.Split (separators);
var matches = words.Count (w =>
    w.Equals (searchedWord, StringComparison.OrdinalIgnoreCase));
var percentage = matches / (float) words.Count;

Обратите внимание, что percentage будет float, например 0.5 для 50%.
Вы можете отформатировать его для отображения, используя перегрузку ToString:

var formatted = percentage.ToString ("P0"); // 0.1234 => 12 %

Вы также можете изменить спецификатор формата для отображения десятичных разрядов:

var formatted = percentage.ToString ("P2"); // 0.1234 => 12.34 %

Имейте в виду, что этот метод неэффективендля больших строк, потому что он создает экземпляр строки для каждого из найденных слов.Возможно, вы захотите взять StringReader и прочитать слово за словом вручную.

2 голосов
/ 05 февраля 2011

Самый простой способ - использовать LINQ:

char[] separators = new char() {' ', ',', '.', '?', '!', ':', ';'};
var count =
    (from word In sentence.Split(separators)      // get all the words
    where word.ToLower() = searchedWord.ToLower() // find the words that match
    select word).Count();                         // count them

Это только подсчитывает, сколько раз слово появляется в тексте. Вы также можете посчитать, сколько слов в тексте:

var totalWords = sentence.Split(separators).Count());

, а затем просто получить процент как:

var result = count / totalWords * 100;
0 голосов
/ 05 февраля 2011
// The words you want to search for
var words = new string[] { "this", "is" };

// Build a regular expresion query
var wordRegexQuery = new System.Text.StringBuilder();
wordRegexQuery.Append("\\b(");
for (var wordIndex = 0; wordIndex < words.Length; wordIndex++)
{
  wordRegexQuery.Append(words[wordIndex]);
  if (wordIndex < words.Length - 1)
  {
    wordRegexQuery.Append('|');
  }
}
wordRegexQuery.Append(")\\b");

// Find matches and return them as a string[]
var regex = new System.Text.RegularExpressions.Regex(wordRegexQuery.ToString(), RegexOptions.IgnoreCase);
var someText = var someText = "This is some text which is quite a good test of which word is used most often. Thisis isthis athisisa.";
var matches = (from Match m in regex.Matches(someText) select m.Value).ToArray();

// Display results
foreach (var word in words)
{
    var wordCount = (int)matches.Count(w => w.Equals(word, StringComparison.InvariantCultureIgnoreCase));
    Console.WriteLine("{0}: {1} ({2:f2}%)", word, wordCount, wordCount * 100f / matches.Length);
}
0 голосов
/ 05 февраля 2011

Мое предложение - полный класс.

class WordCount {
    const string Symbols = ",;.:-()\t!¡¿?\"[]{}&<>+-*/=#'";

    public static string normalize(string str)
    {
        var toret = new StringBuilder();

        for(int i = 0; i < str.Length; ++i) {
            if ( Symbols.IndexOf( str[ i ] ) > -1 ) {
                toret.Append( ' ' );
            } else {
                toret.Append( char.ToLower( str[ i ] ) );
            }
        }

        return toret.ToString();
    }

    private string word;
    public string Word {
        get { return this.word; }
        set { this.word = value; }
    }

    private string str;
    public string Str {
        get { return this.str; }
    }

    private string[] words = null;
    public string[] Words {
       if ( this.words == null ) {
           this.words = this.Str.split( ' ' );
       }

       return this.words;
    }

    public WordCount(string str, string w)
    {
         this.str = ' ' + normalize( str ) + ' ';
         this.word = w;
    }

    public int Times()
    {
        return this.Times( this.Word );
    }

    public int Times(string word)
    {
        int times = 0;

        word = ' ' + word + ' ';

        int wordLength = word.Length;
        int pos = this.Str.IndexOf( word );

        while( pos > -1 ) {
            ++times;

            pos = this.Str.IndexOf( pos + wordLength, word );
        }

        return times;
    }

    public double Percentage()
    {
        return this.Percentage( this.Word );
    }

    public double Percentage(string word)
    {
        return ( this.Times( word ) / this.Words.Length );
    }
}

Преимущества: разделение строк кэшируется, поэтому нет опасности применять его более одного раза. Он упакован в один класс, поэтому его можно легко переоформить. Нет необходимости в Linq. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...