2014-02-11 49 views
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!

回答

9

如果我正确理解你,你想排除重复。您可以使用Enumerable.Distinct

请注意,您需要使用File.ReadAllLines,而不是File.ReadLines,如果你想使用外foreach因为ReadLines使用StreamReader它被设置在第一foreach枚举引擎盖下。

例如:

var matches = 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); 

如果你想在所有行唯一匹配(在这里你可以留在File.ReadLines):

var matches = lines 
    .SelectMany(line => Regex.Matches(line, pattern).Cast<Match>()) 
    .Where(m => m.Success) 
    .Select(m => m.Value) 
    .Distinct(); 

要澄清我的第二个方法,这需要在没有外层的foreach所有自SelectMany已通过选择所有行的所有匹配取代。所以你只需要一个foreach来输出结果。

+0

我已根据您的评论更改了我的代码。我在这里添加了它。但我有错误。也许我做错了某处? – user3214034

+0

@ user3214034:我看到了什么问题。 'File.ReadLines'在引擎盖下使用'StreamReader'。只要执行在内部'foreach'处发生的(LINQ-)查询,就会处理这个问题。所以你必须使用我的第二种方法,它可以返回**所有行的唯一匹配**(与您使用的第一种方法相反)。或者你必须使用'File.ReadAllLines',而不是将所有行读入内存('string []')。请注意,我的第二种方法根本不需要外部'foreach',因为'SelectMany'已经选择了所有行的所有匹配。 –

+0

对不起!我以前的评论是不公平的!它工作出色!谢谢!!! – user3214034

相关问题