我正在使用内置函数来删除重复的行,但是函数正在将空白行也视为重复行。有人可以帮我弄错我的地方吗?这是我的代码:
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);}
示例2(不需要)
答案 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();
}
}