0

現在、foreachループを使用して、listviewitemがリストビューにないかどうか、および再度書き込まないかどうかを確認しようとしています。これはこれまでの私のコードです。

    private void button1_Click(object sender, EventArgs e)
    {
        TextReader reader = new StringReader(richTextBox1.Text);
        string[] strItems = null;
        foreach (ListViewItem item in listView1.Items)
        {
            strItems = reader.ReadLine().Split("-".ToCharArray());
            item.Text = strItems[0].ToString();
            item.SubItems.Add(strItems[1].ToString());
            item.SubItems.Add(strItems[2].ToString());
            item.SubItems.Add(strItems[3].ToString());
            item.SubItems.Add(strItems[4].ToString());
            listView1.Items.Add(item);
        }
    }

すべての助けに感謝します!

4

4 に答える 4

1

を使用して、最初からすべての行を読むこともできますFile.ReadAllLines.Distinct()次に、LINQ の拡張機能を使用して重複を削除できます。

private void button1_Click(object sender, EventArgs e)
{
    string[] lines = File.ReadAllLines(richTextBox1.Text);

    foreach (string line in lines.Distinct())
    {
        listView1.Items.Add(new ListViewItem(line.Split({'-'})));
    }
}

ListViewItemのより便利なコンストラクターも使用しました。

于 2012-06-06T02:15:59.993 に答える
1

@minitech の回答には 1 つの部分が欠けていたと思います。異なる新しいエントリだけを追加するだけでなく、リストボックスに既にある新しいエントリを除外することも必要です。

private void button1_Click(object sender, EventArgs e) 
{
    string[] lines = richTextBox1.Lines;

    // Not sure about the exact Items.Contains() and item.Text usage, but that's the idea
    foreach (string line in lines.Distinct().Where(line => 
        !listView1.Items.Contains(item => line == item.Text)))
    { 
        string[] items = line.Split('-'); 
        listView1.Items.Add(new ListViewItem(items)); 
    } 
} 

これを最適化する方法はいくつかありますが、正しい方法の選択は、リストビューのアイテムが最初にどこから来ているか (およびリストビューにいくつのアイテムがあるか、つまりこれをどれだけ最適化する必要があるか) によって異なります。

于 2012-06-06T02:25:47.367 に答える
0

あなたの質問を理解しているかどうかわかりません。

ListView に既にあるすべてのアイテムを検索して特定の一致を探している場合は、「FindItemWithText()」または同等のものを使用しないでください。

クエリから何も返されない場合、項目はリストにありません。

「それが役立つことを願っています...少なくとも少し...

于 2012-06-06T02:11:23.670 に答える
0

既存の ListViewItem をチェックするためだけのコードですか? コードで新しい項目を空の ListView に追加する場合、ListView に何もない場合は foreach ループに入らないため、失敗します。

既存の ListViewItem を確認するために次のことを試すことができる場合

private void button1_Click(object sender, EventArgs e)
{
    TextReader reader = new StringReader(richTextBox1.Text);
    string[] strItems = null;
    foreach (ListViewItem item in listView1.Items)
    {
        strItems = reader.ReadLine().Split("-".ToCharArray());
        if (ListView1.FindItemWithText(strItems[0].ToString()) != null)
        {
            item.Text = strItems[0].ToString();
            item.SubItems.Add(strItems[1].ToString());
            item.SubItems.Add(strItems[2].ToString());
            item.SubItems.Add(strItems[3].ToString());
            item.SubItems.Add(strItems[4].ToString());
            listView1.Items.Add(item);
        }
    }
}

下記URLをご参照ください

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.listviewitemcollection.find(v=vs.85).aspx

于 2012-06-06T02:29:25.527 に答える