2
我需要从文件(* .txt)中提取唯一字符串。但是我写的代码是为了重复同一行。我需要获取每个唯一的字符串一次。获取唯一字符串C#
我的代码:
OpenFileDialog opendialog = new OpenFileDialog();
if (opendialog.ShowDialog() == DialogResult.OK)
{
var lines = File.ReadLines(opendialog.FileName);
string pattern = @"set vrouter ""([\w-]+)""";
foreach (var line in lines)
{
var matches = Regex.Matches(line, pattern);
foreach (Match match in matches)
{
if (match.Success)
textBox1.AppendText(match.Value + '\n');
}
}
}
输出:
set vrouter R1
set vrouter R1
set vrouter R2
set vrouter R3
set vrouter R2
set vrouter R4
set vrouter R4
set vrouter R5
set vrouter R1
set vrouter R6
set vrouter R4
set vrouter R3
set vrouter R5
更改代码:
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog opendialog = new OpenFileDialog();
if (opendialog.ShowDialog() == DialogResult.OK)
{
var lines = File.ReadLines(opendialog.FileName);
string pattern = @"set vrouter ""([\w-]+)""";
var matches =
lines.SelectMany(line=> Regex.Matches(line, pattern)
.Cast<Match>()).Where(m => m.Success)
.Select(m => m.Value)
.Distinct();
foreach (String match in matches)
{
textBox1.AppendText(match + Environment.NewLine);
}
}
}
它工作正确LY!
我已根据您的评论更改了我的代码。我在这里添加了它。但我有错误。也许我做错了某处? – user3214034
@ user3214034:我看到了什么问题。 'File.ReadLines'在引擎盖下使用'StreamReader'。只要执行在内部'foreach'处发生的(LINQ-)查询,就会处理这个问题。所以你必须使用我的第二种方法,它可以返回**所有行的唯一匹配**(与您使用的第一种方法相反)。或者你必须使用'File.ReadAllLines',而不是将所有行读入内存('string []')。请注意,我的第二种方法根本不需要外部'foreach',因为'SelectMany'已经选择了所有行的所有匹配。 –
对不起!我以前的评论是不公平的!它工作出色!谢谢!!! – user3214034