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