Tôi muốn chuyển một tập hợp con của mảng C# thành một phương thức. Tôi không quan tâm nếu phương pháp ghi đè dữ liệu để tránh tạo bản sao.C# Mảng lát không có bản sao
Có cách nào để thực hiện việc này không?
Cảm ơn.
Tôi muốn chuyển một tập hợp con của mảng C# thành một phương thức. Tôi không quan tâm nếu phương pháp ghi đè dữ liệu để tránh tạo bản sao.C# Mảng lát không có bản sao
Có cách nào để thực hiện việc này không?
Cảm ơn.
Thay đổi phương thức để chụp IEnumerable<T>
hoặc ArraySegment<T>
.
Sau đó bạn có thể vượt qua new ArraySegment<T>(array, 5, 2)
Mảng không thay đổi theo kích cỡ (nghĩa là bạn không thể thay đổi kích thước của mảng), vì vậy bạn chỉ có thể chuyển bản sao trừ của mảng ban đầu. Tùy chọn bạn có thể chuyển hai chỉ mục sang một mảng ban đầu thành phương thức và hoạt động trên cơ sở của hai chỉ mục bổ sung ..
bạn có thể sử dụng LINQ mất Funktion và mất nhiều yếu tố từ mảng như bạn muốn
var yournewarray = youroldarray.Take(4).ToArray();
Nếu bạn thêm 'ToArray' vào cuối thì bạn đang thực hiện một bản sao. Bạn cũng sẽ cần phải sử dụng cả hai 'Bỏ qua' và' Take' để có được một tập con tùy ý. Cuối cùng, nếu anh ta muốn truy cập nhanh được lập chỉ mục trong tập hợp con, anh ta sẽ không nhận được nó từ một 'IEnumerable'. – Servy
-1: OP được đăng cụ thể, anh ấy không _not_ muốn có một bản sao. – Tom
Bạn có thể sử dụng lớp sau. Lưu ý rằng bạn có thể cần sửa đổi tùy thuộc vào việc bạn muốn endIndex
để bao gồm hay không. Bạn cũng có thể sửa đổi nó để bắt đầu và đếm, thay vì bắt đầu và chỉ mục kết thúc.
Tôi cố ý không thêm các phương thức có thể thay đổi. Nếu bạn đặc biệt muốn chúng, thật dễ dàng để thêm. Bạn cũng có thể muốn triển khai IList
nếu bạn thêm các phương thức có thể thay đổi.
public class Subset<T> : IReadOnlyList<T>
{
private IList<T> source;
private int startIndex;
private int endIndex;
public Subset(IList<T> source, int startIndex, int endIndex)
{
this.source = source;
this.startIndex = startIndex;
this.endIndex = endIndex;
}
public T this[int i]
{
get
{
if (startIndex + i >= endIndex)
throw new IndexOutOfRangeException();
return source[startIndex + i];
}
}
public int Count
{
get { return endIndex - startIndex; }
}
public IEnumerator<T> GetEnumerator()
{
return source.Skip(startIndex)
.Take(endIndex - startIndex)
.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Bạn có thể thêm ví dụ về 'IEnumerable 'bằng' Skip'/'Take'. –
@StefanSteinegger: 'ArraySegment' triển khai 'IEnumerable ' –
SLaks
Brilliant, cảm ơn. – user1400716