W perlu funkcja splicingu zwraca nową tablicę elementów z istniejącej tablicy i jednocześnie usuwa te elementy z istniejącej tablicy.Splice na kolekcjach
my @newarry = splice @oldarray, 0, 250;
@newarray
będzie teraz zawierać 250 rekordów z @oldarray
i @oldarray
250 rekordy mniej.
Czy istnieje odpowiednik dla klas kolekcji C#, np. Array, List, Queue, Stack z podobną funkcją? Do tej pory widziałem tylko rozwiązania, w których wymagane są dwa kroki (return + remove).
Update - brak funkcjonalności istnieje więc wprowadziliśmy metodę extensio wspierania funkcji 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;
}
z następującymi testów jednostkowych - który udaje:
[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");
}
}
Brak bezpośrednich odpowiedników w klasach kolekcji .NET. Można oczywiście napisać własną metodę pomocy, która zwraca + usuwa. Jak zamierzasz korzystać z tej metody? Być może istnieje więcej C# ish sposobu to zrobić, zamiast próbować nosić wzór z Perl. – dtb
Dziękuję - stworzyłem metodę rozszerzenia, aby dodać funkcję składania do list - może to być dodatkowo uogólnione do obsługi IEnumerables. – SADeveloper
Można zamienić 'Source.Skip (Start) .Take (Size) .ToList()' od 'Source.GetRange (Start, Size)'. –
Henrik