获得独特的字符串C#

时间:2014-02-11 08:36:21

标签: c# .net regex

我需要从文件(* .txt)中提取唯一的字符串。但我的代码编写,以便重复相同的行。我需要获得一次发出的每个唯一字符串。

我的代码:

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);
    }
  }
}

它正常工作!!!

1 个答案:

答案 0 :(得分: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来输出结果。