Запретить добавление повторяющихся элементов в список

у меня есть этот код для добавления выбранных элементов из одного ListBox в другую. Как я могу запретить пользователю добавлять элемент дважды? Я хочу ListBox они добавляют к lstBoxToUserProjects содержать только отдельные элементы без повторяющихся записей.

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

5 ответов


Если вы связываете lstBoxToUserProjects список к источнику данных (HashSet), то вы можете сделать простую проверку, чтобы увидеть, если элемент, предложенный для выбора уже был в месте назначения:

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

примечание. Я предлагаю хэш-набор, потому что тогда вы можете выполнить проверку на набор, тогда как список должен быть перечислен для проверки соответствия.


вы должны просто позвонить в ListBox.Предметы.Содержит () в операторе if, чтобы проверить, был ли он уже добавлен.

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, по крайней мере.


изменить itemsToAdd С List to HashSet:

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

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

добавить MSDN:

Возвращаемое Значение

Тип: System.Логическое значение 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>();