如何使用 foreach 检查项是否不在控件中

本文关键字:控件 是否 何使用 foreach 检查 | 更新日期: 2023-09-27 18:36:28

我目前正在尝试使用 foreach 循环来检查列表视图项是否不在列表视图中,以及是否不再写入它。这是我到目前为止的代码。

    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);
        }
    }

感谢所有帮助!

如何使用 foreach 检查项是否不在控件中

您也可以先阅读所有行,使用 File.ReadAllLines .然后,可以使用 LINQ 的.Distinct()扩展删除重复项:

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更方便的构造函数。

我认为@minitech的答案遗漏了一块:您不仅要仅添加不同的新条目,还希望过滤掉列表框中已有的任何新条目。

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)); 
    } 
} 

有一些方法可以优化这一点,但选择正确的方法将取决于列表视图的项目首先来自哪里(以及列表视图中有多少项目,即您需要多少来优化它)。

我不确定我是否理解你的问题。

如果要在列表视图中搜索特定匹配项中已有的所有项,那么为什么不直接使用"FindItemWithText()"或等效项:

  • http://msdn.microsoft.com/en-us/library/y3h4x385.aspx

  • http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.listviewitemcollection.find.aspx

如果查询未返回任何内容,则该项不在列表中。

"希望对...至少一点点...

您的代码仅用于检查现有的 ListViewItem 吗?如果希望代码向空 ListView 添加新项,则它将失败,因为如果 ListView 中没有任何内容,它不会进入 foreach 循环。

如果可以尝试以下方法来检查现有的列表视图项

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);
        }
    }
}

请参考下面的网址

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