2014-02-11 52 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

相關問題