Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取唯一字符串C#_C#_.net_Regex - Fatal编程技术网

获取唯一字符串C#

获取唯一字符串C#,c#,.net,regex,C#,.net,Regex,我需要从文件(*.txt)中提取唯一字符串。但是我的代码是这样写的,所以同一行代码会重复。我需要让每个唯一的字符串发出一次 我的代码: OpenFileDialog opendialog = new OpenFileDialog(); if (opendialog.ShowDialog() == DialogResult.OK) { var lines = File.ReadLines(opendialog.FileName); string pattern = @"set vroute

我需要从文件(*.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);
    }
  }
}
输出:

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);
    }
  }
}
更改代码:

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);
    }
  }
}
private void按钮1\u单击(对象发送者,事件参数e)
{
OpenFileDialog opendialog=新建OpenFileDialog();
如果(opendialog.ShowDialog()==DialogResult.OK)
{
var lines=File.ReadLines(opendialog.FileName);
字符串模式=@“set vrouter”“([\w-]+)”“;
变量匹配=
lines.SelectMany(line=>Regex.Matches(line,pattern)
.Cast())。其中(m=>m.Success)
.选择(m=>m.Value)
.Distinct();
foreach(匹配中的字符串匹配)
{
textBox1.AppendText(match+Environment.NewLine);
}
}
}

它工作正常

如果我理解正确,您希望排除重复项。您可以使用
可枚举.Distinct

请注意,如果要使用外部
foreach
,则需要使用
File.readallines
而不是
File.ReadLines
,因为
ReadLines
在第一次
foreach
枚举时在引擎盖下使用
StreamReader

例如:

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

为了澄清我的第二种方法,这根本不需要外部foreach,因为
SelectMany
已经通过选择所有行的所有匹配项来替代它。因此,您只需要一个
foreach
即可输出结果。

我已根据您的评论更改了代码。我把它加在这里了。但我有错误。也许我在某个地方出错了???@user3214034:我知道问题出在哪里了<代码>文件。ReadLines在引擎盖下使用
StreamReader
。一旦执行在内部
foreach
中发生的(LINQ-)查询,就会立即处理此问题。因此,您必须使用我的第二种方法,它返回所有行的唯一匹配(与您使用的第一种方法相反)。或者您必须使用
File.ReadAllLines
,它首先将所有行读入内存(
string[]
)。请注意,我的第二种方法根本不需要外部
foreach
,因为
SelectMany
已经选择了所有行的所有匹配项。