2017-03-20 3 views
0

私はプログラムを持っており、保存ファイルを作成しています。これは、現在、リストボックスをチェックし、その内容をテキストファイルに書き留めることでこれを行います。C#テキストファイル内で2つの文字列が同一であるかどうかを検出する方法

私が欲しいのは、テキストファイルが2つの同一の文字列をテキストファイルで検出すると、そのうちの1つが削除されるということです。

path = @"C:\thing.txt"; 
if (!File.Exists(path)) 
{ 
    FileStream fs = File.Create(path); 
    fs.Close(); 
} 

if (checkedListBox1.Items.Count > 0) 
{ 
    using (TextWriter tw = File.AppendText(path)) 
    { 
     foreach (string fileName in fullFileName) 
     { 
      foreach (string item in checkedListBox1.Items) 
       tw.WriteLine(fileName); //writes file path to textfile 
     } 
    } 
} 
else 
{ 
    //nothing to do! There is nothing to save! 
} 

そしてテキストファイルで、これを含んでいることを言うことができます:

C:\Jack.exe 
C:\COolstuff.exe 

私はテキストファイルは、代わりに私はそれが三行目を削除したい

C:\Jack.exe 
C:\COolstuff.exe 
C:\Jack.exe 

を持っている必要はありません。 C:\ Jack.exeは1行目と一致しているためです。

+0

。リストの内容をテキストファイルに書き込みます。 1つの事のために – Trey

+0

はそれらを何度も書きません - チェックボックスごとに1回チェックされます:) –

+0

'fullFileName 'はどこから来たのですか? –

答えて

3

残りのコードを見ることなく、私はLINQのDistinct()を使用してこれを迅速に実行できると信じています。

foreach (string fileName in fullFileName.Distinct()) 

これはforeachだけのユニークな文字列を返すようになります。 LINQ名前空間への参照を追加する必要があるかもしれないことに注意してください。 Distinct()にエラーが発生した場合は、その上にカーソルを置き、ctrl+,を使用してVSがそれを提案するようにします。

+0

悲しいことに、動作しません。コードにエラーはありませんでした。同じ内容を2度もコピーするだけです。 –

+0

@RohanPasこれはあなたの質問に対する私のコメントで何を意味しているのですか?複数回は書きません。ファイル名を選択し、チェックボックスがチェックされている回数だけ書き込む –

0

テキストファイルの重複を削除する場合は、配列内のすべての行を読み込んでリストに変更するよりも、Distinct()を使用して、このように新しいリストをテキストファイルに書き直すことができます:

string[] lines = File.ReadAllLines(filePath); 

List<string> list = lines.ToList(); 

list = list.Distinct().ToList(); 

File.WriteAllLines(filePath, list.ToArray()); 

さらに詳しい情報はDistinctです。

0

私が正しく理解しているのは、一意の値を保存するだけなので、保存した値を最初に読み取って新しい値と比較するとよいでしょう。保存したファイルが存在しない

  1. コードの流れは次のようになりますか?

    • なし - >チェックするリストボックス
      • fileNameにリストがある場合には、各項目のファイル名リスト
    • にファイルの内容を保存読む - >
    • はい空fileNameにリストを作成それを含んでいない場合は、newFilesリストに追加してください。
  2. 0にnewFilesリストの内容を追加します実際に

、これは次のようになります。あなたがリストにdupesを追加しないでください読んで、リストにそれらすべてを投げ

string saveFilePath = @"c:\data\savedFiles.txt"; 
List<string> savedFileNames = new List<string>(); 
List<string> newFileNames = new List<string>(); 

// If our save file exists, read all contents into the 'saved file' list 
if (File.Exists(saveFilePath)) 
{ 
    savedFileNames.AddRange(File.ReadAllLines(saveFilePath)); 
} 

// For each item in our check box, add it to our 'new 
// file' list if it doesn't exist in the 'saved file' list 
foreach (var checkedItemin CheckedListBox1.CheckedItems) 
{ 
    if (!savedFileNames.Contains(checkedItem)) 
    { 
     newFileNames.Add(checkedItem.ToString()); 
    } 
} 

// Append our new file names to the end of the saved file (this 
// will also create the file for us if it doesn't already exist) 
File.AppendAllLines(saveFilePath, newFileNames); 
関連する問題