2012-02-23 12 views
6

Ho questo codice per aggiungere elementi selezionati da uno ListBox a un altro. Come posso impedire all'utente di aggiungere un articolo due volte? Voglio che lo ListBox si aggiungano a lstBoxToUserProjects per contenere solo elementi distinti senza voci duplicate.Impedire l'aggiunta di elementi duplicati a un ListBox

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: Ecco quello che ho finito per usare

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

Hai pensato di usare il metodo contiene nella lista per vedere se è già presente? –

risposta

4

Se si associa la casella lstBoxToUserProjects elenco a un'origine dati (HashSet), allora si potrebbe fare un semplice controllo per vedere se l'oggetto proposto per la selezione era già in la destinazione:

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

Nota che sto proponendo un HashSet perché allora si può fare un controllo performante sul set considerando che l'elenco dovrebbe essere enumerati per verificare la presenza di un match.

0

Variazione itemsToAdd da List a HashSet:

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

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

Add MSDN:

Return Value

Tipo: System.Boolean true se l'elemento viene aggiunto al HashSet (Of T) oggetto; falso se l'elemento è già presente. (Gdoron- e non inserendo di nuovo l'elemento ...)

+0

Non sto facendo la tua risposta, ma penso che OP abbia effettivamente bisogno che gli elementi in 'ListBox' siano unici, non solo in un'azione di aggiunta singola. – Krizz

+0

@ Krizz. **?!?! **. Se "Aggiungi" non causerà la duplicazione, come accadrebbe? – gdoron

+0

Sei sicuro che 'ListBox.ObjectCollection.Add' non garantisce duplicati? – Krizz

3

È sufficiente chiamare ListBox.Items.Contains() in un'istruzione if per verificare se è già stato aggiunto.

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

Perché non correggerai la formattazione invece di scusarti? – Krizz

+0

Non riuscivo a capire come regolare la formattazione.Capirò come formattare correttamente quando avrò più tempo per. – cain

+0

ha fatto questo per te questa volta, per il futuro: basta indentare almeno 4 spazi. – Krizz

2

Prova questo:

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

Ciò presuppone C# 3.5, almeno.

0

Usa

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

metodo è veloce quindi confrontando dove _items_Unique e _items sono due elenco

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