2010-07-12 34 views
18

Tôi có một vòng lặp mà tôi tạo ra một số giá trị chuỗi dựa trên một số điều kiện nhất định. Tôi đã đặt đối tượng StringBuilder bên ngoài vòng lặp và mỗi lần tôi có hàng mới trong vòng lặp tôi cần phải xóa các giá trị nối thêm StringBuilder cho hàng này.Làm thế nào để StringBuilder trống một lần nữa trong .NET 3.5?

Làm cách nào để xóa những nội dung đó?

 StringBuilder sb = new StringBuilder(); 

     foreach (DataRow row in recipientsList.Rows) 
     { 
      sb.Length = 0; 
      sb.Append("<ul>"); 
      if (row["needsToActivate"] == "1") 
      { 
       sb.AppendFormat("<li>{0}</li>", getUsersWithoutActivationTemplate()); 
      } 
      if (row["needsToEnterSite"] == "1") 
      { 
       sb.AppendFormat("<li>{0}</li>", getUsersWithoutEnteringWebsiteForTwoWeeksTemplate()); 
      } 
      if (row["needsPicture"] == "1") 
      { 
       sb.AppendFormat("<li>{0}</li>", getUsersWithoutPicturesTemplate()); 
      } 
      if (row["needsText"] == "1") 
      { 
       sb.AppendFormat("<li>{0}</li>", getUsersWithoutTextTemplate()); 
      } 
      if (row["needsCharacteristic"] == "1") 
      { 
       sb.AppendFormat("<li>{0}</li>", getUsersWithoutCharateristicsTemplate()); 
      } 
      if (row["needsHobby"] == "1") 
      { 
       sb.AppendFormat("<li>{0}</li>", getUsersWithoutHobbiesTemplate()); 
      } 
      sb.Append("</ul>"); 
} 

Mã có câu trả lời được chấp nhận;

+0

Khi nào bạn muốn thực hiện thanh toán bù trừ trong vòng lặp hoặc sau khi kết thúc? –

+0

bạn có thể hiển thị một số mã, có vẻ như bạn chỉ muốn giữ giá trị mới nhất. –

Trả lời

47

Bạn có thể đơn giản;

sb.Length = 0; 
+0

chính xác những gì tôi cần. Tôi đã gần như sử dụng sb.Remove() làm phức tạp vấn đề. – eugeneK

+2

bạn có thể sử dụng điều này: sb.Remove (0, sb.Length); – AminM

+2

Nó không phải là ý tưởng tốt nhất khi bạn đang làm việc với các chuỗi rất dài. Nó có thể gây ra ngoại lệ OOM. Giải thích thêm được cung cấp trên MSDN: https://social.msdn.microsoft.com/Forums/en-US/db04ba8c-e13e-4d41-89a2-f5601ec3e0ae/outofmemoryexception-setting-stringbuilder-length-to-0?forum=vbgeneral –

12

StringBuilder.Clear(); là những gì bạn muốn.

+2

.NET 3.5 Xin lỗi! – eugeneK

+9

Điều này chỉ có sẵn trong .Net 4. Net <= 3.5 cần sử dụng 'sb.Length = 0;' – codekaizen

4

Đặt độ dài thành 0 hoặc bằng .Net 4 Tôi tin rằng bạn có thể gọi phương thức Clear() mới.

2

Giả sử bạn xác định StringBuilder của bạn như thế này: StringBuilder sb = new StringBuilder();

Bạn có thể làm bất cứ điều nào sau đây:

Gọi phương pháp rõ ràng:

for (int i = 0; i < 100; i++) 
{ 
    sb.Clear(); 
    .. your code here .. 
} 

Đặt độ dài bằng không:

for (int i = 0; i < 100; i++) 
{ 
    sb.Length = 0; 
    .. your code here .. 
} 

Set nó vào một đối tượng mới:

for (int i = 0; i < 100; i++) 
{ 
    sb = new StringBuilder(); 
    .. your code here .. 
} 
+0

Điều cuối cùng thay vì đánh bại mục đích sử dụng StringBuilder ngay từ đầu ... – codekaizen

+0

@codekaizen, đã đồng ý! – eugeneK

+1

@codekaizer: Không, cái cuối cùng có lẽ cũng hiệu quả như việc sử dụng lại thứ đó. Việc sử dụng thực sự của SB là những gì xảy ra trong phần còn lại của vòng lặp. –

2

Bạn c một tái sử dụng một StringBuilder (với .Clear() hoặc .Length = 0) nhưng nếu bạn thực sự muốn tối ưu hóa bạn nên cố gắng ước tính độ dài cuối cùng. Nếu điều này phát triển một chút mỗi lần lặp lại, việc kiện lại có thể chậm hơn (nhiều mem) hơn là tạo một cái mới mỗi lần.

foreach (DataRow row in recipientsList.Rows) 
{ 
    int estimatedLength = 5000; // maybe a calculation based on row-data 
    StringBuilder sb = new StringBuilder(estimatedLength); 
    .... 

} 

Vì vậy, trong khi các câu trả lời ở đây về cách để làm điều đó là chính xác, lời khuyên tốt nhất là không để làm điều đó. Đó là một tối ưu hóa vi mô, và bạn không cần những lợi ích rất nhỏ ở đây và bạn không muốn các biến chứng thêm (nhỏ). Bạn có thể tối ưu hóa một chút ở đây nếu chuỗi kết quả là rất lớn nhưng chắc chắn không làm cho một thói quen này.

+0

chiều dài tối đa là tám, có thể thấp hơn. Vì vậy, bạn đang nói rằng nếu tôi gán chiều dài mặc định tôi không cần phải sb.Length = 0 hoặc nó sẽ chỉ tạo ra đối tượng nhỏ hơn và giảm thời gian? – eugeneK

+0

Nếu tôi nhìn vào những AppendFormat() gọi chiều dài của bạn sẽ lớn hơn tám. Nhưng có, sử dụng một ước tính tốt cho chiều dài dự kiến ​​và không cố gắng tái sử dụng như thế này. –

+0

tôi có 8 Phương thức chắp thêm mà nó cho là chiều dài hoặc chiều dài của chuỗi lớn nhất được nối thêm? – eugeneK

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