C # - добавление в строку и замена на новую строку - PullRequest
2 голосов
/ 27 июля 2011

Если у меня есть RichTextBox, который загружен из файла, связанного с:

TEXT MORETEXT 10.505  100.994 0  
TEXT MORETEXT -5.132  -12.994 90  
TEXT MORETEXT 100.001 -8.994  270  

и TextBox, которые содержат все, что пользователь вводит в текстовое поле. Допустим, пользователь вводит "10.005" .

У меня вопрос , как мне взять это значение и добавить в столбец 3rd , содержащий значения 10.505, -5.132, 100.001 . Как только оно будет добавлено, я хотел бы взять значение и заменить старое значение в строке. SO Обновленный RichTextBox будет выглядеть следующим образом.

TEXT MORETEXT 20.510  100.994 0  
TEXT MORETEXT 4.873  -12.994 90  
TEXT MORETEXT 110.006 -8.994  270  

ПРЯМО СЕЙЧАС Я могу удалить строки из RichTextBox, используя этот код:

    private void calculateXAndYPlacementTwo()
    {
        // Reads the lines in the file to format.
        var fileReader = File.OpenText(filePath);

        // Creates a list for the lines to be stored in.
        var fileList = new List<string>();

        // Adds each line in the file to the list.
        while (true)
        {
            var line = fileReader.ReadLine();
            if (line == null)
                break;
            fileList.Add(line);
        }

        // Creates new lists to hold certain matches for each list.
        var xyResult = new List<string>();
        var xResult = new List<string>();
        var yResult = new List<string>();

        // Iterate over each line in the file and extract the x and y values
        fileList.ForEach(line =>
        {
            Match xyMatch = Regex.Match(line, @"(?<x>-?\d+\.\d+)\s+(?<y>-?\d+\.\d+)");
            if (xyMatch.Success)
            {
                // grab the x and y values from the regular expression match
                String xValue = xyMatch.Groups["x"].Value;
                String yValue = xyMatch.Groups["y"].Value;

                // add these two values, separated by a space, to the "xyResult" list.
                xyResult.Add(String.Join(" ", new[]{ xValue, yValue }));

                // Adds the values into the xResult and yResult lists.
                xResult.Add(xValue);
                yResult.Add(yValue);

                // Place the 'X' and 'Y' values into the proper RTB.
                xRichTextBox.AppendText(xValue + "\n");
                yRichTextBox.AppendText(yValue + "\n");
            }
        });
    }

Чтобы получить значения в xRichTextBox, выглядящие так:

10.505
-5.132
100.001

и yRichTextBox в виде:

100.994
-12.994
-8.994

Но я не знаю, как превратить эти значения в значения, для которых можно использовать добавление ...


EDIT: Я обдумал это еще немного ... Сейчас я использую этот код (ниже), чтобы попытаться выполнить то, что мне нужно. Это только для "X" (3-й столбец) .

ОДНАКО ЭТОТ КОД НЕ РАБОТАЕТ (он объединяет пользовательский ввод в конец xRichTextBox вместо математического добавления его в каждую строку ..)

xDisplacementTextBox - это пользовательский ввод, а xRichTextBox - это извлеченные значения из основной строки.

StringBuilder stringBuilder = new StringBuilder();
string[] Lines = xRichTextBox.Text.Split('\n');
double d = double.Parse(xDisplacementTextBox.Text);

for(int i = 0; i < Lines.Length; ++i)
{
    string newThing = double.Parse((Lines[i]) + d).ToString();
    stringBuilder.AppendLine(newThing);
}

xRichTextBox.Text = stringBuilder.ToString();

Это также не позволяет мне вводить значения с десятичными значениями (т. Е. 50,005) ..

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Посмотрите на double.Parse - как в double x = double.Parse (xValue);

Расширять и выполнять свою работу за вас ...

double d = double.Parse(xDisplacementTextBox.Text);
string[] Lines = xRichTextBox.Text.Split('\n');

for(int i = 0; i < Lines.Length; ++i)
{
    Match lineMatch = Regex.Match(lines[i], @"^(?<p>.*)(?<x>-?\d+\.\d+)(?<y>\s+-?\d+\.\d+\s+-?\d+\.\d+)$");
    if (lineMatch.Success)
    {
        double xValue = double.Parse(lineMatch.Groups["x"].Value) + d;
        lines[i] = lineMatch.Groups["p"] + xValue + lineMatch.Groups["p"];
    }
 }
 xRichTextBox.Text = string.Join(lines, '\n');
3 голосов
/ 27 июля 2011

Слишком много строк и недостаточно структур данных.

Это похоже на структуру данных:

ТЕКСТ МОРЕТЕКСТ 10.505 100.994 0
ТЕКСТ МОРЕТЕКСТ -5.132 -12.994 90
ТЕКСТ МОРЕТЕКСТ 100.001 -8.994 270

Итак, создайте класс, который содержит

"Text" string
"MoreText" string
10.505 - double (let's call this prop1)
100.994 - double
0 - int

Я размышляю над значениями данных здесь.

Загрузите список <> вашего класса в память.

Затем, применяйте значение текстового поля к вашему списку объектов каждый раз, когда значение изменяется.

PsuedoCode:

foreach(class c in List<>)
    {
     c.prop1 = c.prop1 + (double)Textbox.value;
    }

Переопределите ToString() в своем классе и покажите объект по необходимости в поле расширенного текста.

Лично я бы использовал список для отображения объектов.

...