「test.txt」に書き込む前に、その内容を列挙します。
var fileLines = File.ReadAllLines("test.txt");
List<string> fileItems = new List<string>(fileLines);
次に、各項目を書き込む前に、リストに含まれているかどうかを確認します。
using (StreamWriter writer = new StreamWriter("test.txt", true))
{
foreach (object item in listBox2.Items)
{
if (fileItems.Contains(item))
// Do something, break, etc.
else
writer.WriteLine(item.ToString());
}
}
編集:
提案に従って、一意の値のみを含めることができるため、パフォーマンスのために a のHashSet
代わりに aを使用できます。List
もう 1 つの改善点は、ファイルに何かを書き込む前に、重複が存在するかどうかを確認することです。以下の例では、LINQ ステートメントでそれを実行しました。
var fileLines = File.ReadAllLines("test.txt");
HashSet<string> fileItems = new HashSet<string>(fileLines);
using (StreamWriter writer = new StreamWriter("test.txt", true))
{
bool duplicateFound = fileItems.Any(fi => listBox1.Items.Cast<string>().Any(i => i == fi));
if (duplicateFound)
MessageBox.Show("Duplicate items found.");
else
foreach (object item in listBox1.Items)
writer.WriteLine(item.ToString());
}
編集2:
@Servyが示唆したように、リストボックスには重複が含まれる可能性があるため、これも考慮する必要があります。さらに、私の HashSet 実装は標準以下でした。したがって、この 3 番目の例では、最初にリストボックスに重複が含まれているかどうかを確認し、次にリストボックス項目のいずれかが既にファイルに含まれているかどうかを確認しています。HashSet の使用は、反復していないため、パフォーマンスも向上します。
var fileLines = File.ReadAllLines("test.txt");
HashSet<string> fileItems = new HashSet<string>(fileLines);
List<string> duplicateListboxItems = listBox1.Items.Cast<string>().GroupBy(l => l).Where(g => g.Count() > 1).Select(g => g.Key).ToList();
if (duplicateListboxItems.Count > 0)
{
MessageBox.Show("The listbox contains duplicate entries.");
return;
}
bool duplicateFound = false;
List<string> outputItems = new List<string>();
foreach (string item in listBox1.Items)
{
if (fileItems.Contains(item))
{
MessageBox.Show(String.Format("The file has a duplicate: {0}", item));
duplicateFound = true;
break;
}
outputItems.Add(item);
}
if (duplicateFound)
return;
using (StreamWriter writer = new StreamWriter("test.txt", true))
{
foreach (string s in outputItems)
writer.WriteLine(s);
}