как лучше всего сортировать строки в RichTextBox

Я ищу лучший способ сортировки строк RichTextBox, сейчас я использую это:

public void SortLines(object sender, EventArgs e)
{
    TextPointer pStart = TextInput.Document.ContentStart;
    TextPointer pEnd = TextInput.Document.ContentEnd;
    TextRange text = new TextRange(pStart, pEnd);

    string[] lines = text.Text.Split('\n');
    Array.Sort(lines);
    text.Text = String.Join(String.Empty, lines);
}
  1. Есть ли лучший способ сделать это?

  2. Когда я его вызываю, курсор помещается в первую строку RichTextBox, как мне поместить его туда, где он был раньше? Я пытался установить pStart/pEnd и CaretPositiom, но свойства доступны только для чтения.

Я надеюсь, что это ясно. Заранее спасибо.


person Jack    schedule 25.01.2012    source источник
comment
по чему вы сортируете (по первой букве, количеству букв или чему-то еще)? Вы хотите, чтобы курсор был помещен в одно и то же относительное место (т.е. если у вас есть строки A, B, C, а курсор находится в B, то вы сортируете, а новый порядок - C, A, B, тогда курсор должен оставаться с B или остаться в А)?   -  person Jake Berger    schedule 26.01.2012


Ответы (4)


Неэлегантное, но практичное решение; назад и вперед richtextbox в ListBox: в свойствах вашего listBox вы нажимаете «отсортировано»> true

[c#]

ListBox1.Items.AddRange(RichTextBox1.Lines);
for (int x = 0; (x 
            <= (ListBox1.Items.Count - 1)); x++) {
    RichTextBox1.AppendText((ListBox1.Items(x).ToString.Environment.NewLine));
}

[ВБ.NET]

ListBox1.Items.AddRange(RichTextBox1.Lines)
For x As Integer = 0 To ListBox1.Items.Count - 1
RichTextBox1.AppendText(ListBox1.Items(x).ToString & Environment.NewLine)
Next
person Eric Paroissien    schedule 07.12.2016

Что касается сортировки, это решение не отличается от предложенного вами, но я нахожу его более элегантным + оно обрабатывает местоположение и выбор курсора:

public void SortLines(object sender, EventArgs e)
{
       rtb.HideSelection = false; //for showing selection
        /*Saving current selection*/
        string selectedText = rtb.SelectedText;
        /*Saving curr line*/
        int firstCharInLineIndex = rtb.GetFirstCharIndexOfCurrentLine();
        int currLineIndex = rtb.Text.Substring(0, firstCharInLineIndex).Count(c => c == '\n');
        string currLine = rtb.Lines[currLineIndex];
        int offset = rtb.SelectionStart -firstCharInLineIndex;


        /*Sorting*/
        string[] lines = rtb.Lines;
        Array.Sort(lines, delegate(string str1, string str2) { return str1.CompareTo(str2); });
        rtb.Lines = lines;

        if (!String.IsNullOrEmpty((selectedText)))
        {
            /*restoring selection*/
            int newIndex = rtb.Text.IndexOf(selectedText);
            rtb.Select(newIndex, selectedText.Length);
        }
        else
        {   /*Restoring the cursor*/

            //location of the current line
            int lineIdx = Array.IndexOf(rtb.Lines, currLine);
            int textIndex = rtb.Text.IndexOf(currLine);
            int fullIndex = textIndex + offset;
            rtb.SelectionStart =  fullIndex;
            rtb.SelectionLength = 0;
        }
}
person Avi Turner    schedule 02.12.2013
comment
Зачем использовать компаратор для Sort? Без него нормально обойдется? Кроме того, как это поддерживает позицию курсора? - person Servy; 03.12.2013
comment
@servy это просто для обеспечения гибкости для изменения критериев сортировки. - person Avi Turner; 03.12.2013

Спасибо, Эрик Паруасьен, за простое решение! В коде C# было несколько проблем - вот его решение с исправлением

ListBox1.Items.Clear();
ListBox1.Items.AddRange(RichTextBox1.Lines);
RichTextBox1.Clear();
for (int x = 0; (x <= (ListBox1.Items.Count - 1)); x++)
{
    RichTextBox1.AppendText(ListBox1.Items[x].ToString());
    RichTextBox1.AppendText(Environment.NewLine);
}
person TheJonz    schedule 09.02.2018

RichTextBox работает как массив, мы можем использовать array.sort следующим образом:

    Dim MyArray() As String
    MyArray = RichTextBox1.Lines
    Array.Sort(MyArray)
    RichTextBox1.Clear()
    For Each item In MyArray
        RichTextBox1.Text &= item & Environment.NewLine
    Next
person YaoChen Aan    schedule 01.03.2021