1

テキスト ファイルにリスト ボックスの項目が含まれているかどうかを確認するにはどうすればよいですか。重複の保存を停止するには。これに何を追加するかわかりません。これは、ボタン クリック イベントで呼び出されます。たとえば、重複が見つかった場合、表示できますMessageBox.Show ("duplicate error");

 using (StreamWriter writer = new StreamWriter("test.txt", true))
        {
            foreach (object item in listBox2.Items)
            {
                writer.WriteLine(item.ToString());
            }
        }    
4

2 に答える 2

3

「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);
}
于 2012-11-30T20:29:41.577 に答える
1
string filePath = "test.txt";
var existingLines = new HashSet<string>(File.ReadAllLines(filePath));

var linesToWrite = new List<string>();
foreach (string item in listBox2.Items)
{
    if (existingLines.Add(item))
    {
        linesToWrite.Add(item);
    }
    else
    {
        //this is a duplicate!!!
    }
}

File.AppendAllLines(filePath, linesToWrite);
于 2012-11-30T20:29:08.337 に答える