Получить последние 3 символа при наборе пользователя - PullRequest
1 голос
/ 08 января 2011

Мне нужно получить последние три символа из richTextBox, когда пользователь пишет текст в richTextbox.

Я привязываю свойство к свойству Text richTextBox из расширенного инструментария WPF.

public string RtbText
{
    get { return _rtbText; }
    set
    {
        _rtbText = value;
        NotifyPropertyChanged("RtbText");
    }
}

Я использую Reactive Extensions для .NET (Rx) и делаю Observer для свойства RtbText

    Observable.FromEvent<PropertyChangedEventArgs>(this, "PropertyChanged")
        .Where(e => e.EventArgs.PropertyName == "RtbText")
        .Select(_ => this.RtbText)
        .Where(text => text.Length > 1)
        .Do(AddSmiles)
        .Throttle(TimeSpan.FromSeconds(1))
        .Subscribe(GetLastThreeChars);

   private void GetLastThreeChars(string text)
   {
       if (text.Length > 3)
       {
           string lastThreeChars = text.Substring(text.Length - 2, text.Length);
       }
   }

Но если я начну печатать в richTextBox, я получу следующее исключение:

Индекс и длина должны указывать на местоположение в строке.
Имя параметра: длина

в System.String.InternalSubStringWithChecks (Int32 startIndex, Int32 длина, логическая fAlwaysCopy)
в System.String.Substring (IntIn startIndex, Int32 длина)
в WpfApplication1.MainWindow.GetLastThreeChars (текст строки) в C: \ Users \ Jan \ Documents \ Visual Studio 2010 \ Projects \ C # \ Pokec_Messenger \ ver.beta \ IoC.Get \ Pokec_Messenger \ ver.beta \ Pokec_ Messenger \ WpfApplication1 \ MainWindow.xaml.cs: строка 97
в System.Linq.Observable. <> c
_DisplayClass389`1. <> c_ DisplayClass38b.b _388 (TSource x)

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Если text.Length > 3 (скажем, это 4), то:

text.Length - 2 = 2

Итак, ваш код:

string lastThreeChars = text.Substring(2, 4);

Это не удастся, так как вы запрашиваете четыре символов в подстроке, что выводит ее из диапазона.

Метод String.Substring (Int32, Int32)

Извлекает подстроку изэтот экземпляр.Подстрока начинается с указанной позиции символа и имеет указанную длину .

Кроме того, ваш тест и начальная позиция неверны.Не забывайте, что массивы и строки C # проиндексированы нулями.Проверяя регистр длины, строго превышающий 3, вы пропустите случай, когда пользователь ввел ровно три символа, когда вы хотите вернуть всю строку.

Ваш код должен быть:

if (text.Length > 2)
{
    string lastThreeChars = text.Substring(text.Length - 3, 3);
}

Если вам не нужно указывать длину:

if (text.Length > 2)
{
    string lastThreeChars = text.Substring(text.Length - 3);
}

вернет последние три символа в строке.

1 голос
/ 08 января 2011

Это еще одна форма. Который получает все символы от некоторой начальной позиции до конца

string lastThreeChars = text.Substring(text.Length - 3);

возможно текст. Длина - 2. Не проверено

...