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