Ronald McDonald
Ronald McDonald

Reputation: 2911

Prevent duplicate items from being added to a ListBox

I have this code for adding selected items from one ListBox to another. How can I prevent the user from adding an item twice? I want the ListBox they are adding to lstBoxToUserProjects to only contain distinct items with no duplicate entries.

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

EDIT: Here's what I ended up using

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

Upvotes: 6

Views: 27369

Answers (5)

Raman Singh
Raman Singh

Reputation: 161

Use

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

method it's fast then comparing where _items_Unique and _items are two list

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

Upvotes: 0

cain
cain

Reputation: 66

You should just call ListBox.Items.Contains() in an if statement to check if it has already been added.

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

Upvotes: 3

Krizz
Krizz

Reputation: 11552

Try this:

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

This assumes C# 3.5, at least.

Upvotes: 2

kaj
kaj

Reputation: 5251

If you bind the lstBoxToUserProjects list box to a datasource (HashSet) then you could do a simple check to see if the item proposed for selection was already in the destination:

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

Note I'm proposing a HashSet because then you can do a performant check on the set whereas a List would have to be enumerated to check for a match.

Upvotes: 4

gdoron
gdoron

Reputation: 150313

Change itemsToAdd from List to HashSet:

HashSet<ListItem> itemsToAdd= new HashSet<ListItem>();

...
itemsToAdd.Add(listItem) // Adds only new items.

Add MSDN:

Return Value

Type: System.Boolean true if the element is added to the HashSet(Of T) object; false if the element is already present. (gdoron- and not inserting the element again...)

Upvotes: 0

Related Questions