仅导出非重复行

时间:2016-07-18 13:07:40

标签: c#

我目前正致力于保存非重复行。我的代码太宽了,无法将它放在那里,所以我只会向你展示它的一部分。

我们说我有一个100行的textbox1。如果我单击一个按钮,textbox2中的每一行都会复制到textbox1。现在textbox1包含120行文本。

我接下来要做的是从textbox1中删除重复行和空行。可以说我删了15行。

现在,我的textbox1包含105行文本。现在我在textbox2中添加了另一个文本,所有进程再次启动。

这意味着textbox2与textbox1结合包括15个重复行和5个非重复行。我想在textbox3中显示非重复的行。

输入1

textbox1:
1
2
3
4
5

textbox2:
1
2

6


70

输出1

textbox1:
1
2
3
4
5
6
70

textbox3:
6
70

输入2

textbox1:
1
2
3
4
5
6
70

textbox2:
1
555


1
1
5


999

0

输出2

textbox1:
1
2
3
4
5
6
70
555
999
0

textbox3:
6
70
555
999
0

删除重复和空白行的代码:

textBox1.Text += "\r\n";
textBox1.Text += textBox2.Text;

textBox1.Text = Regex.Replace(textBox1.Text, @"^\s*$(\n|\r|\r\n)", "", RegexOptions.Multiline);


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

我正在为textbox1添加换行符,因为没有在textbox2的最后一行末尾添加第一行textbox2。

我坚持导出非重复行,我决定在那里问。

3 个答案:

答案 0 :(得分:3)

您可以使用LINQ的Union()添加避免重复的行,并使用Except()来查找非重复的行。 Where()可以帮助您过滤掉空行:

var lines1 = textBox1.Lines.Where(s => !string.IsNullOrWhiteSpace(s));
var lines2 = textBox2.Lines.Where(s => !string.IsNullOrWhiteSpace(s));
textBox1.Lines = lines1.Union(lines2).ToArray();
textBox3.Lines = lines2.Except(lines1).ToArray();

// If you need to append the non-duplicate contents instead of replacing
// it in the textBox3, remove the previous operation and uncomment the
// following line:
//textBox3.Lines = textBox3.Lines.Concat(lines2.Except(lines1)).ToArray();

答案 1 :(得分:2)

这里最好的方法是转换List< string >中每个TextBox的文本,这样您就可以使用Linq和Distinct()扩展方法来获取非重复的行。

var rows1 = this.textBox1.Text.Split(new string[] { "\r\n" }).ToList();
var rows2 = this.textBox2.Text.Split(new string[] { "\r\n" }).ToList();
rows1.AddRange(rows2);
rows1 = rows1.Distinct().ToList();

答案 2 :(得分:0)

您可以使用此oneliner:

var distinct =
    string.Join(Environment.NewLine, new []
    {
        textbox1.Text,
        textbox2.Text// You can add as many input as needed
    }).Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries).ToList().Distinct();