Trong perl, hàm ghép nối trả về một mảng các mục mới từ một mảng hiện có và đồng thời loại bỏ các mục này khỏi mảng hiện có.Ghép nối trên bộ sưu tập
my @newarry = splice @oldarray, 0, 250;
@newarray
bây giờ sẽ chứa 250 hồ sơ từ @oldarray
và @oldarray
là 250 hồ sơ ít hơn.
Có tương đương với các lớp thu thập C# tức là Array, List, Queue, Stack với chức năng tương tự không? Cho đến nay tôi đã chỉ nhìn thấy các giải pháp mà hai bước được yêu cầu (return + remove).
Update - không có chức năng tồn tại vì vậy tôi đã thực hiện một phương pháp extensio để hỗ trợ chức năng 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;
}
Với bài kiểm tra đơn vị sau đây - mà thành công:
[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");
}
}
Không có tương đương trực tiếp trong các lớp thu thập .NET. Bạn có thể, tất nhiên, viết phương pháp trợ giúp của riêng bạn mà trả lại + loại bỏ. Bạn định sử dụng phương pháp này như thế nào? Có lẽ có một cách C# ish hơn để làm điều đó thay vì cố gắng để thực hiện một mô hình từ Perl. – dtb
Cảm ơn bạn - Tôi đã tạo một phương thức mở rộng để thêm chức năng ghép nối vào danh sách - điều này cũng có thể được tổng quát hơn để hỗ trợ IEnumerables. – SADeveloper
Bạn có thể thay thế 'Source.Skip (Bắt đầu) .Take (Size) .ToList()' by 'Source.GetRange (Bắt đầu, Kích thước)'. –
Henrik