una pasar otra listas lista igualar elementos dentro copiar clonar agregar c# linq list

pasar - igualar dos listas c#



¿Cómo muevo elementos de una lista a otra lista en C#? (5)

¿Qué tal una partición?

int[] items = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var partition = items.ToLookup(x => x > 5); var part1 = partition[true]; var part2 = partition[false];

¿Cuál es la forma preferible para transferir algunos elementos (no todos) de una lista a otra?

Lo que estoy haciendo es lo siguiente:

var selected = from item in items where item.something > 10 select item; otherList.AddRange(selected); items.RemoveAll(item => selected.Contains(item));

En el interés de tener el código más rápido / mejor que existe, ¿hay una mejor manera?


Eso es bastante malo en cuanto al rendimiento: en realidad enumera una consulta n veces (para n elementos en items ). Sería mejor si construyes (por ejemplo) un HashSet<T> de los elementos a manipular.

Para dar un ejemplo simple solo con valores int :

var items = new List<int> { 1, 2, 3, 4, 5, 6 }; var otherList = new List<int>(); var selected = new HashSet<int>(items.Where( item => item > 3)); otherList.AddRange(selected); items.RemoveAll(selected.Contains);


Probaría la respuesta de @ Mehrdad, y tal vez la probaría contra esta también ...

var selected = items.Where(item => item.Something > 10).ToList(); selected.ForEach(item => items.Remove(item)); otherList.AddRange(selected);


RemoveAll recorre cada elemento y enumera todos los valores de su lista seleccionada cada vez. Esto llevará más tiempo del que debería ...

Lo que haría es poner la condición directamente en el parámetro RemoveAll:

items.RemoveAll(item => item.something > 10);

Si haces esto y no cambias el resto de tu código, habrá una duplicación de código, lo cual no es bueno. Haría lo siguiente para evitarlo:

Func<ItemType, bool> selectedCondition = (item => item.something > 10); otherList.AddRange(items.Where(selectedCondition)); items.RemoveAll(new Predicate<ItemType>(selectedCondition));


Yo sugiero:

var selected = items.Where(item => item.Something > 10).ToList(); items = items.Except(selected).ToList(); otherList.AddRange(selected);