Как удалить дублирующиеся результаты строки из текстового поля - PullRequest
0 голосов
/ 19 марта 2020

Вот мой код результата данных

он получает двойные результаты строки

Я хочу удалить дублированный результат

Пожалуйста, помогите мне

private void DataResult(string result, string acc, string file)
{
    lock (this)
    {
        if (result == "good")
        {
            MetroTextBox metroTextBox = this.textBox1;
            metroTextBox.Text = metroTextBox.Text + acc + Environment.NewLine;
            file = Path.Combine(this.papka, "good.txt");
            if (!Directory.Exists(this.papka))
            {
                Directory.CreateDirectory(this.papka);
            }
            File.AppendAllText(file, acc + "\r\n");
            Listing.good++;
        }
        if (result == "error")
        {
            Listing.error++;
        }
    }
}

Ответы [ 3 ]

1 голос
/ 19 марта 2020

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

if(!metroTextBox.Text.Contains(acc))
  metroTextBox.Text = metroTextBox.Text + acc + Environment.NewLine;

Примечание. если вы переименуете текстовое поле в форме, вам не нужно будет устанавливать sh переменные с другими именами. Щелкните по текстовому полю в форме, и в сетке свойств, где написано (Имя) textbox1, измените его на metroTextBox

Примечание 2; этот код добавляет содержимое текстового поля в файл каждый раз, когда добавляет строку в текстовое поле. Это также может быть источником дублирования, если имя файла не меняется, потому что после добавления 3 строк ваш файл будет выглядеть так:

line1
line1
line2
line1
line2
line3

Я не рекомендую вам писать файл так часто, как вы добавляете строка в текстовое поле; одна операция тривиальна, другая действительно медленная и сложная. Разделите эти вещи на разные методы и реже вызывайте файл записи

1 голос
/ 19 марта 2020

Добавьте это к using директивам вверху страницы:

using System.Linq;

Затем просто используйте вот так:

metroTextBox.Text = string.Join(Environment.NewLine, metroTextBox.Lines.Distinct());

В вашем примере:

private void DataResult(string result, string acc, string file)
{
    lock (this)
    {
        if (result == "good")
        {
            MetroTextBox metroTextBox = this.textBox1;
            metroTextBox.Text = string.Join(metroTextBox.Lines.Distinct(), acc, Environment.NewLine);
            file = Path.Combine(this.papka, "good.txt");
            if (!Directory.Exists(this.papka))
            {
                Directory.CreateDirectory(this.papka);
            }
            File.AppendAllText(file, acc + "\r\n");
            Listing.good++;
        }
        if (result == "error")
        {
            Listing.error++;
        }
    }
}
0 голосов
/ 19 марта 2020

Вы можете попробовать собрать уникальные результаты с помощью HashSet<string>, например,

private HashSet<string> m_Results = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

, затем

private void DataResult(string result, string acc, string file)
{
    lock (this)
    {
        if (result == "good")
        {
            if (m_Results.Add(result)) {
                 // result is unique (not in m_Results)
                 MetroTextBox metroTextBox = this.textBox1;
                 metroTextBox.Text = metroTextBox.Text + acc + Environment.NewLine;

                 file = Path.Combine(this.papka, "good.txt");

                 //DONE: no need to check for directoty exitance
                 Directory.CreateDirectory(this.papka);

                 File.AppendAllText(file, acc + "\r\n");
            }
            else {
                 // result has been appeared before 
            }

            Listing.good++;
        }

        if (result == "error")
        {
            Listing.error++;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...