una registros refrescar obtener objetos mostrar listas lista eliminar elementos elemento editar agregar c# .net list variable-assignment generic-list

c# - registros - Reemplazar un objeto en una lista de objetos



obtener elemento de una lista c# (3)

En C #, si tengo una List<T> , y tengo un objeto de tipo T , ¿cómo puedo reemplazar un elemento específico en la List<T> con el objeto de tipo T ?

Esto es lo que he intentado:

List<CustomListItem> customListItems = new List<CustomListItem>(); CustomListItem customListItem1 = new CustomListItem() { name = "Item 1", date = DateTime.MinValue}; CustomListItem customListItem2 = new CustomListItem() { name = "Item 2", date = DateTime.MinValue }; CustomListItem customListItem3 = new CustomListItem() { name = "Item 3", date = DateTime.MinValue }; customListItems.Add(customListItem1); customListItems.Add(customListItem2); customListItems.Add(customListItem3); CustomListItem newCustomListItem = new CustomListItem() { name = "Item 4", date = DateTime.Now }; customListItem2 = customListItems.Where(i=> i.name == "Item 2").First(); customListItem2 = newCustomListItem;

En el código anterior, quiero reemplazar el customListItem2 con el newCustomListItem .

¿Tengo que eliminar el elemento de la lista y luego insertar el nuevo elemento? ¿No puedo hacer una asignación simple de customListItem2 = newCustomListItem ?

¿Cuál es la forma más eficiente de reemplazar un artículo en una lista con otro artículo?

Gracias por adelantado


Si la secuencia de la lista no te importa, entonces puedes probar esto

CustomListItem newCustomListItem = new CustomListItem() { name = "Item 4", date = DateTime.Now }; customListItem2 = customListItems.Where(i=> i.name == "Item 2").First(); customListItems.Remove(customListItem2); customListItems.Add(newCustomListItem );


customListItem2 reemplazar el elemento, no el valor de customListItem2 . Simplemente reemplace lo siguiente:

customListItem2 = customListItems.Where(i=> i.name == "Item 2").First(); customListItem2 = newCustomListItem;

Con este:

customListItem2 = customListItems.Where(i=> i.name == "Item 2").First(); var index = customListItems.IndexOf(customListItem2); if(index != -1) customListItems[index] = newCustomListItem;

Editar:

Como señaló Roman R. en un comentario, puede reemplazar el .Where(predicate).First() por un First(predicate) simple:

customListItem2 = customListItems.First(i=> i.name == "Item 2");


var customListItems = new List<CustomListItem>(); var customListItem1 = new CustomListItem() { name = "Item 1", date = DateTime.MinValue }; var customListItem2 = new CustomListItem() { name = "Item 2", date = DateTime.MinValue }; var customListItem3 = new CustomListItem() { name = "Item 3", date = DateTime.MinValue }; customListItems.Add(customListItem1); customListItems.Add(customListItem2); customListItems.Add(customListItem3); var newCustomListItem = new CustomListItem() { name = "Item 4", date = DateTime.Now }; customListItems[customListItems.FindIndex(x => x.name == "Item 2")] = newCustomListItem;

o

public static class ListExtensions { public static void Replace<T>(this List<T> list, Predicate<T> oldItemSelector , T newItem) { //check for different situations here and throw exception //if list contains multiple items that match the predicate //or check for nullability of list and etc ... var oldItemIndex = list.FindIndex(oldItemSelector); list[oldItemIndex] = newItem; } }

y entonces

customListItems.Replace(x => x.name == "Item 2", newCustomListItem);