2009-02-26 35 views
17

Nếu tôi có một mảng byte đã tạo byte [] binBuffer = new byte [256] và tôi điền 100 byte của mảng, nếu tôi muốn chỉ chuyển 100 byte đó cho một số phương thức khác , là nó có thể làm điều đó mà không tạo ra một mảng byte mới của 100 byte, sao chép từ mảng cũ đến mới, sau đó đi qua mảng mới? Có bằng cách nào đó tôi chỉ có thể vượt qua 100 byte đầu tiên. Ứng dụng của tôi đặc biệt áp dụng để chuyển mảng tới một thủ tục được lưu trữ.sử dụng một phần của mảng byte

Trả lời

2

Nếu bạn có thể sử dụng LINQ:

SomeMethod(binBuffer.Take(100)); 
+0

Tôi quá lười biếng để kiểm tra - nhưng điều đó thực sự KHÔNG chỉ sao chép mảng vào một mảng mới có kích thước 100? –

+0

Đồng ý với Andrew. Điều này nên được kiểm tra kỹ. –

+0

Các tài liệu nêu rõ phương thức sử dụng thực thi hoãn lại, truy vấn được biểu diễn không được thực hiện cho đến khi đối tượng được liệt kê bằng GetEnumerator hoặc foreach. Lấy (src) liệt kê nguồn và tạo ra các phần tử cho đến khi các phần tử đếm được sinh ra hoặc src không chứa các phần tử nào khác. Vì vậy, tôi đoán nó không sao chép. – Jeremy

1

nếu bạn đang sử dụng .net 3.5 bạn có thể sử dụng phương pháp mở rộng Đưa() và làm như sau:

class Program 
{ 
    static void Main(string[] args) 
    { 
     byte[] b = new byte[1000]; 

     dowork(b.Take(10).ToArray()); 

    } 

    public static void dowork(byte[] b) 
    { 
     // do some work 
    } 
} 
+0

Nếu bạn downvote, xin vui lòng nêu lý do tại sao ... Vì vậy, chúng tôi có thể hiểu tại sao câu trả lời đưa ra là không hợp lệ. – Jeremy

+0

Tôi đã không làm downvoting, nhưng tôi giả sử nó đã được thực hiện bởi vì câu hỏi nói rằng "mà không tạo ra một mảng byte mới," mà 'Take()' chắc chắn nhất hiện. – Alex

1

Khi một mảng được truyền với một phương thức, chỉ một tham chiếu đến nó thực sự được truyền, vì các mảng thực sự là các kiểu tham chiếu. Về cơ bản, bạn có một con trỏ đến mảng, và sau đó bù đắp trong các dấu ngoặc vuông chỉ cho bạn biết có bao nhiêu "khe" cách xa điểm bắt đầu. Do đó, cách duy nhất để thực hiện điều này là chuyển hai tham số cho phương thức của bạn. Một là mảng thực, và thứ hai là số tối đa cho đến khi bạn cần đến, trong trường hợp của bạn, nó sẽ là 100. Trong phương thức đó bạn chỉ lặp qua mảng cho đến khi đạt đến số tối đa.

18

Một mô hình rất phổ biến khi làm việc với bộ đệm là: mô hình

Foo(byte[] data, int offset, int count) {...} 

. Tuy nhiên, bạn không thể sử dụng điều này với tham số SqlCommand /, vì khi bạn gán cho tham số, nó sẽ chiếm toàn bộ bộ đệm. Bạn sẽ cần một mảng mới:

byte[] second = new byte[100]; 
Buffer.BlockCopy(first, firstOffset, second, 0, 100); 
param.Value = second; 
2

Câu trả lời ngắn gọn là: KHÔNG. Bất cứ điều gì bạn làm (ngoài việc truyền mảng đó làm tham số) sẽ tạo một mảng mới và sao chép 100 byte đầu tiên trong đó.

Tuy nhiên, vì bạn không chuyển mảng theo giá trị, nhưng thay vì chuyển một tham chiếu đến nó, tại sao nó lại quan trọng với bạn nếu mảng là 256 byte hoặc 100? Bạn không lãng phí nhiều bộ nhớ hơn. Bạn có thể cần phải cho biết phương thức sử dụng mảng đó, tuy nhiên, vì phương thức Length sẽ trả về độ dài đầy đủ.

CHỈNH SỬA: Tôi vừa mới nhận ra rằng bạn muốn chuyển mảng tới một quy trình được lưu trữ. Điều này sẽ sao chép toàn bộ mảng. Bạn sẽ phải tạo một bản sao chỉ với các phần tử bạn muốn chuyển.

Các vấn đề liên quan