我目前正致力于保存非重复行。我的代码太宽了,无法将它放在那里,所以我只会向你展示它的一部分。
我们说我有一个100行的textbox1。如果我单击一个按钮,textbox2中的每一行都会复制到textbox1。现在textbox1包含120行文本。
我接下来要做的是从textbox1中删除重复行和空行。可以说我删了15行。
现在,我的textbox1包含105行文本。现在我在textbox2中添加了另一个文本,所有进程再次启动。
这意味着textbox2与textbox1结合包括15个重复行和5个非重复行。我想在textbox3中显示非重复的行。
textbox1:
1
2
3
4
5
textbox2:
1
2
6
70
textbox1:
1
2
3
4
5
6
70
textbox3:
6
70
textbox1:
1
2
3
4
5
6
70
textbox2:
1
555
1
1
5
999
0
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。
我坚持导出非重复行,我决定在那里问。
答案 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();