防止将重复项添加到列表框中

本文关键字:列表 添加 | 更新日期: 2023-09-27 18:25:40

我有这段代码,用于将选定的项目从一个ListBox添加到另一个。如何防止用户添加项目两次?我希望他们添加到lstBoxToUserProjectsListBox只包含不重复项的不同项。

protected void btnAddSelectedItem_Click(object sender, EventArgs e)
{
    List<ListItem> itemsToAdd= new List<ListItem>();
    foreach (ListItem listItem in lstbxFromUserProjects.Items)
    {
        if (listItem.Selected)
            itemsToAdd.Add(listItem);
    }
    foreach (ListItem listItem in itemsToAdd)
    {
        lstBoxToUserProjects.Items.Add(listItem);
    }
}

编辑:以下是我最终使用的

protected void btnAddSelectedItem_Click(object sender, EventArgs e)
{
    List<ListItem> itemsToAdd= new List<ListItem>();
    foreach (ListItem listItem in lstbxFromUserProjects.Items)
    {
        if (listItem.Selected)
            itemsToAdd.Add(listItem);
    }
    foreach (ListItem listItem in itemsToAdd)
    {
        if (!lstBoxToUserProjects.Items.Contains(listItem)) 
        {
            lstBoxToUserProjects.Items.Add(listItem);
        }
    }
}

防止将重复项添加到列表框中

如果您将lstBoxToUserProjects列表框绑定到数据源(HashSet),那么您可以进行简单的检查,看看建议选择的项目是否已经在目标中:

foreach(ListItem itemToAdd in itemsToAdd)
{
    if (selectedItems.Contains(itemToAdd)) continue;
    lstBoxToUserProjects.Items.Add(itemToAdd);
}

注意,我建议使用HashSet,因为这样您就可以对该集进行性能检查,而必须枚举List才能检查匹配。

您只需要在if语句中调用ListBox.Items.Contains()来检查它是否已经添加。

foreach (ListItem listItem in itemsToAdd)
{
    if (!lstBoxToUserProjects.Items.Contains(listItem))
    {
        lstBoxToUserProjects.Items.Add(listItem);
    }
}

试试这个:

protected void btnAddSelectedItem_Click(object sender, EventArgs e)
{
    lstBoxToUserProjects.Items.AddRange(lstbxFromUserProjects.Items.Where(li => !lstBoxToUserProjects.Items.Contains(li)).ToArray());
}

这至少假定了C#3.5。

itemsToAddList更改为HashSet:

HashSet<ListItem> itemsToAdd= new HashSet<ListItem>();
...
itemsToAdd.Add(listItem) // Adds only new items.

添加MSDN:

返回值

Type:System.Boolean true,如果元素被添加到HashSet(Of T)对象如果元素已经存在,则为false。(gdoron-并且不再插入元素…)

使用

_items_Unique = _items.Distinct().ToList();

方法它很快,然后比较其中_items_Unique和_items是两个列表

List<string> _items_Unique = new List<string>();
List<string> _items = new List<string>();