2016-07-08 9 views
3
public override void Write(byte[] buffer, int offset, int count) 
{    
    var bytesToWriteTotal = count; 

    while (bytesToWriteTotal > 0) 
    { 
     // If we do not have enough space in the cloud, we'll reserve more 
     var capacity = GetCurrentCapacity(); 
     var delta = Position + bytesToWriteTotal - capacity; 

     if (delta > 0) 
     { 
      Resize(2 * (capacity + delta)); 
     } 
     ... 

が、私は十分なスペースを持っているか、私はこのようなoffsetを追加する必要があることを確実にするために、それが正しい方法です: var delta = Position + offset + bytesToWriteTotal - capacity;Stream.Writeを使用して、より多くの領域を正しく予約する方法は?

+0

http://referencesource.microsoft.com/#mscorlib/system/io/memorystream.cs,a27df287b28d9a2a –

答えて

2


offsetを追加しないでください、それはあなたが読み始め、そこからbuffer、内部の位置です。あなたはcountの数字を読んでいるので、書き込むバイト数です。

あなたはwhileループの前に、一回の拡張を行う必要があります:あなたが唯一の(capacity + delta)バイトを必要とするので

リサイズに2を乗じ
var capacity = GetCurrentCapacity(); 
var delta = Position + count - capacity; 
if (delta > 0) { 
    Resize(2 * (capacity + delta)); 
} 
var bytesToWrite = count; 
while (bytesToWriteTotal > 0) { 
    ... 
} 

は、あまりにも積極的かもしれません。

+0

乗算について。私は複雑さのために良いアイデアだと思う。あなたはデルタでサイズを増やす必要があると言った。もしn個の演算がn個の書き込みで構成されていれば、合計コストは1 + 2 + 3 + 4 + n = 0(n^2)となる。 – Anatoly

+0

@Anatoly 'Write'が繰り返し呼び出されると、呼び出し側は'Write'を呼び出すループに入る前に' Resize'を呼び出す必要があります。 'Write'メソッドそのものの中で、呼び出しパターンの形式を推測することは容易ではありません。 – dasblinkenlight

関連する問題