2012-02-23 91 views
6

Tengo este código para agregar elementos seleccionados de un ListBox a otro. ¿Cómo puedo evitar que el usuario agregue un artículo dos veces? Quiero el ListBox que están agregando al lstBoxToUserProjects para que solo contenga elementos distintos sin entradas duplicadas.Impedir que se agreguen elementos duplicados 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: Esto es lo que terminé usando

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

Ha considerado el uso del método contiene en la lista para ver si ya está presente? –

Respuesta

4

Si enlaza la caja lstBoxToUserProjects lista a una fuente de datos (HashSet) entonces usted podría hacer una simple comprobación para ver si el tema propuesto para su selección ya estaba en el destino:

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

Nota que estoy proponiendo un HashSet porque entonces se puede hacer una verificación de performant en el set Considerando que la lista tendría que ser enumerado para comprobar si hay un partido.

0

Cambio itemsToAdd de List a HashSet:

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

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

Add MSDN:

Valor de retorno

Tipo: System.Boolean true si el elemento se añade a la HashSet (Of T) objeto; falso si el elemento ya está presente. (Gdoron- y no insertar el elemento de nuevo ...)

+0

No estoy respondiendo -1, pero creo que OP realmente necesita elementos en 'ListBox' para ser únicos, no solo en una sola acción de adición. – Krizz

+0

@Krizz. **?!?! **. Si 'Add' no causará duplicación, ¿cómo ocurriría? – gdoron

+0

¿Estás seguro de que 'ListBox.ObjectCollection.Add' no garantiza duplicados? – Krizz

3

Simplemente debe llamar a ListBox.Items.Contains() en una declaración if para comprobar si ya se ha agregado.

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

¿Por qué no se soluciona el formateo en lugar de disculparse por ello? – Krizz

+0

No pude encontrar la manera de ajustar el formato.Descubriré cómo formatearlo correctamente cuando tenga más tiempo para hacerlo. – cain

+0

hizo esto por usted esta vez, para el futuro - simplemente sangría al menos 4 espacios. – Krizz

2

Prueba esto:

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

Esto supone C# 3.5, por lo menos.

0

Uso

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

método es rápido y luego comparando donde _items_Unique y _items dos listas de

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