如何删除重复的字符串而不删除空白行? C#

时间:2019-03-25 10:39:53

标签: c# string

我正在使用内置函数来删除重复的行,但是函数正在将空白行也视为重复行。有人可以帮我弄错我的地方吗?这是我的代码:

 protected void Remove_Duplicate_Lines_Click(object sender, EventArgs e)
    {          
       (Remove_Empty_Lines_CheckBox_id.Checked)      // Remove Blank Rows

         String input_txt = "A \n\n B \n \n B \n\n C \n\n C \n\n D \n\n E";

                string[] distinctLines = input_txt.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).Distinct().ToArray(); 
                txt_output.InnerText = string.Join("\r\n", distinctLines);}

示例: enter image description here

示例2(不需要)

enter image description here

3 个答案:

答案 0 :(得分:2)

有一些问题,主要是您的分居。您编写的input__txt包含“ \ n”,但稍后尝试拆分本身为“ \ n \ r”的Environment.NewLine。因此,拆分不会如您所愿地发生。

让我们考虑一下:

String input_txt = "A \n A \n B \n D \n A \n E";

第二,即使您在“ \ n”上分割,结果也将有2个A条目,即“ A”和“ A”,因为您没有修剪任何内容。

我的建议是分割多个模式并删除空条目。您可能还需要Trim()每个项目,或者只是在拆分模式中添加“”。最终结果在条目之间不会有任何空白行。要在以后需要空白行时对其进行控制,请在需要输出时自行执行。

String input_txt = "A \n A \n B \n D \n A \n E";

string[] distinctLines = input_txt.Split(new string[] { Environment.NewLine, "\n", " " }, StringSplitOptions.RemoveEmptyEntries)
                                    .Select(x => x.Trim())
                                    .Distinct()
                                    .ToArray();
txt_output.InnerText = string.Join(Environment.NewLine + Environment.NewLine, distinctLines);

这将输出:

A

B

D

E

答案 1 :(得分:1)

在这里无法使用Distinct(),因为不能保证Distinct()保持元素顺序。使用传统方法:循环和一些变量以记住状态。

使用HashSet来记住您之前看过的行,使用bool变量来记住自从我们上次向输出列表输出内容以来,输入中是否有空行。 / p>

string inputText = textBox1.Text;
List<string> outputLines = new List<string>();

// Use appropriate String Comparer based on your requirements
HashSet<string> seenLines = new HashSet<string>(StringComparer.CurrentCultureIgnoreCase);
bool seenEmptyLine = false;

string[] lines = inputText.Split('\n');

foreach(string line in lines)
{
    string trimmedLine = line.Trim();

    if(trimmedLine == "")
    {
        // When we see an empty line, we remember that we have seen one
        seenEmptyLine = true;
    }
    else
    {
        // When we see a non-empty line, we add it only when we have not seen it before
        if(seenLines.Contains(trimmedLine))
        {
            // Seen line before, skip it
        }
        else
        {
            // Remember we have seen this line
            seenLines.Add(trimmedLine);

            // if we have seen an empty line since adding last line,
            // add empty line
            if(seenEmptyLine)
            {
                seenEmptyLine = false;
                outputLines.Add("");
            }

            outputLines.Add(trimmedLine);
        }
    }

}

string outputText = string.Join(Environment.NewLine, outputLines);

textBox2.Text = outputText;

答案 2 :(得分:0)

一种方法是实现自己的EqualityComparer:

void Main()
{
    var str = "A\nA\n\n\nB\n\nD\nA\n\nE";

    var before = str.Split(new string[] { "\n" }, StringSplitOptions.None);
    var after = before.Distinct(new MyComparer());
}

public class MyComparer : EqualityComparer<string>
{
    public override bool Equals(string x, string y)
    {
        if(x == "" && y == "")
            return false;
        return x.Equals(y);
    }

    public override int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}