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