C# 检查列表视图是否包含项目

C# 检查列表视图是否包含项目,c#,listview,C#,Listview,我有一个包含3列的listview id、name、author,我使用此方法添加行: public void addToLv(Book book) { //TODO: Verifier si l'item existe avant d'ajouter ListViewItem lvi1 = new ListViewItem(book.id.ToString()); lvi1.Text = book.id.ToString();

我有一个包含3列的listview id、name、author,我使用此方法添加行:

     public void addToLv(Book book)
    {

        //TODO: Verifier si l'item existe avant d'ajouter
        ListViewItem lvi1 = new ListViewItem(book.id.ToString());
        lvi1.Text = book.id.ToString();
        lvi1.SubItems.Add(book.name);
        lvi1.SubItems.Add(carte.author);

        listView1.Items.Add(lvi1);

    }
现在我不想在插入新的book之前检查book是否存在,以避免重复元素,我尝试了这段代码,但它不起作用 我使用过这条线路,但它不起作用:

  (listView1.Items.ContainsKey(book.id))
         {
      listView1.Items.Add(lvi1);
         }

你能帮我吗?谢谢

看起来您正在属性上存储您的个人名称,因此您需要查询该名称以查看是否存在给定的图书名称。您可以使用一点LINQ来实现这一点,如下所示:

// If your ListView doesn't contain any items that have a given book as a SubItem
// then add one
if (!listView1.Items.Any(i => i.SubItems.ContainsKey(book.Name))
{
    listView1.Items.Add(lvi1);
}
由于您的编辑指示您实际上希望检查存储在ListItem级别的ID,因此您只需稍微调整条件即可检查Text属性,因为:


看起来您正在属性上存储您的个人名称,因此您需要查询该名称以查看是否存在给定的图书名称。您可以使用一点LINQ来实现这一点,如下所示:

// If your ListView doesn't contain any items that have a given book as a SubItem
// then add one
if (!listView1.Items.Any(i => i.SubItems.ContainsKey(book.Name))
{
    listView1.Items.Add(lvi1);
}
由于您的编辑指示您实际上希望检查存储在ListItem级别的ID,因此您只需稍微调整条件即可检查Text属性,因为:


我想你错过了一场比赛!不在你的代码中

(!listView1.Items.ContainsKey(book.id))
     {
  listView1.Items.Add(lvi1);
     }

您的代码表示,如果listview包含该键,您将添加另一个具有该键的条目。但你似乎想做相反的事,对吗?如果您的listview不包含具有该键的条目,则需要添加具有该键的条目。

我认为您错过了一个!不在你的代码中

(!listView1.Items.ContainsKey(book.id))
     {
  listView1.Items.Add(lvi1);
     }
您的代码表示,如果listview包含该键,您将添加另一个具有该键的条目。但你似乎想做相反的事,对吗?如果listview不包含具有该键的条目,则需要添加具有该键的条目。

来自:

关键比较不区分大小写。Name属性对应于ListView.ListViewItemCollection中ListViewItem的键

因此,必须设置名称才能使用ContainsKey

然后其他人也像你一样:

if (!listView1.Items.ContainsKey(book.id.ToString()))
{
     listView1.Items.Add(lvi1);
}
发件人:

关键比较不区分大小写。Name属性对应于ListView.ListViewItemCollection中ListViewItem的键

因此,必须设置名称才能使用ContainsKey

然后其他人也像你一样:

if (!listView1.Items.ContainsKey(book.id.ToString()))
{
     listView1.Items.Add(lvi1);
}

如果有任何方法有效,请尝试以下方法:

    public void addToLv(Book book)
    {
        //TODO: Verifier si l'item existe avant d'ajouter
        ListViewItem lvi1 = new ListViewItem(book.id.ToString());
        //lvi1.Text = book.id.ToString();
        lvi1.SubItems.Add(book.name);
        lvi1.SubItems.Add(carte.author);

        if (!existChecker(book.id.ToString()))
            listView1.Items.Add(lvi1);
    }

    private bool existChecker(string id)
    {
        bool exist = false;

        for (int i = 0; i < lvi1.Items.Count && exist != true; i++)
        {
            if (lvi1.Items[i].SubItems[0].Text == id)
                exist = true;
        }
        return exist;
    }

如果有任何方法有效,请尝试以下方法:

    public void addToLv(Book book)
    {
        //TODO: Verifier si l'item existe avant d'ajouter
        ListViewItem lvi1 = new ListViewItem(book.id.ToString());
        //lvi1.Text = book.id.ToString();
        lvi1.SubItems.Add(book.name);
        lvi1.SubItems.Add(carte.author);

        if (!existChecker(book.id.ToString()))
            listView1.Items.Add(lvi1);
    }

    private bool existChecker(string id)
    {
        bool exist = false;

        for (int i = 0; i < lvi1.Items.Count && exist != true; i++)
        {
            if (lvi1.Items[i].SubItems[0].Text == id)
                exist = true;
        }
        return exist;
    }

看起来子项包含图书名称。这是哪个客户端库/技术?您在上面的代码中是指图书而不是点菜吗?看起来子项包含图书名称。这是哪个客户端库/技术?您在上面的代码中是指图书而不是点菜吗?抱歉,我不想与图书进行比较。id不是图书名称,如果您愿意的话若要比较ID,则可以使用!listView1.Items.Anyi=>i.Text==book.id作为您的条件。我已经用一个例子更新了我的答案。我在任何CS1061中都有一个错误:'listview1'不包含'Any'的定义,并且找不到接受'listview1'类型的第一个参数的扩展方法'Any'。您是否缺少using指令或程序集引用?。您需要引用LINQ,即使用System.LINQ。抱歉,我不想进行比较使用book.id而不是book name如果要比较id,则可以使用!listView1.Items.Anyi=>i.Text==book.id作为您的条件。我已经用一个例子更新了我的答案。任何CS1061都有一个错误:'listview1'不包含'Any'的定义,并且找不到接受'listview1'类型的第一个参数的扩展方法'Any'。是否缺少using指令或程序集引用?。您需要引用LINQ,即使用System.LINQ。