En perl, la función de empalme devuelve una nueva matriz de elementos de una matriz existente y al mismo tiempo elimina estos elementos de la matriz existente.Empalme en colecciones
my @newarry = splice @oldarray, 0, 250;
@newarray
ahora contendrá 250 registros de @oldarray
y @oldarray
es 250 registros menos.
¿Existe un equivalente para las clases de colección C#, es decir, Array, List, Queue, Stack con una función similar? Hasta ahora solo he visto soluciones en las que se requieren dos pasos (return + remove).
Actualización - no existe ninguna funcionalidad por lo que han puesto en práctica un método extensio para apoyar la función de empalme:
public static List<T>Splice<T>(this List<T> Source, int Start, int Size)
{
List<T> retVal = Source.Skip(Start).Take(Size).ToList<T>();
Source.RemoveRange(Start, Size);
return retVal;
}
Con la siguiente prueba Unidad - que sucede:
[TestClass]
public class ListTest
{
[TestMethod]
public void ListsSplice()
{
var lst = new List<string>() {
"one",
"two",
"three",
"four",
"five"
};
var newList = lst.Splice(0, 2);
Assert.AreEqual(newList.Count, 2);
Assert.AreEqual(lst.Count, 3);
Assert.AreEqual(newList[0], "one");
Assert.AreEqual(newList[1], "two");
Assert.AreEqual(lst[0], "three");
Assert.AreEqual(lst[1], "four");
Assert.AreEqual(lst[2], "five");
}
}
No hay equivalente directo en las clases de colección .NET. Por supuesto, puedes escribir tu propio método de ayuda que devuelve + eliminar. ¿Cómo piensas usar el método? Tal vez haya una forma más C# ish de hacerlo en lugar de tratar de llevar un patrón desde Perl. – dtb
Gracias: he creado un método de extensión para agregar la función de empalme a las listas; esto también podría generalizarse para admitir IEnumerables. – SADeveloper
Puede reemplazar 'Source.Skip (Start) .Take (Size) .ToList()' por 'Source.GetRange (Start, Size)'. –
Henrik