In perl, la funzione di giunzione restituisce una nuova matrice di elementi da una matrice esistente e allo stesso tempo rimuove questi elementi dall'array esistente.Giuntura sulle raccolte
my @newarry = splice @oldarray, 0, 250;
@newarray
ora conterrà 250 record da @oldarray
e @oldarray
è di 250 record di meno.
Esiste un equivalente per le classi di raccolta C#, ad esempio Array, List, Queue, Stack con una funzione simile? Finora ho visto solo soluzioni in cui sono richiesti due passaggi (return + remove).
Update - esiste alcuna funzionalità così ho implementato un metodo extensio per supportare la funzione Splice:
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 il seguente test Unit - che succede:
[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");
}
}
Non esiste un equivalente diretto nelle classi di raccolta .NET. Potresti, ovviamente, scrivere il tuo metodo di supporto che restituisce + rimuovi. Come intendi usare il metodo? Forse c'è un altro modo C# di farlo, invece di provare a portare un modello da Perl. – dtb
Grazie - Ho creato un metodo di estensione per aggiungere la funzione di splicing alle liste - questo potrebbe anche essere ulteriormente generalizzato per supportare IEnumerables. – SADeveloper
È possibile sostituire 'Source.Skip (Start) .Take (Size) .ToList()' di 'Source.GetRange (Start, Size)'. –
Henrik