2010-09-04 28 views
5

Tôi cần chuyển đổi bộ sưu tập <string,string> thành một chuỗi chứa tất cả các giá trị trong bộ sưu tập như KeyValueKeyValue ... Nhưng làm cách nào để thực hiện điều này một cách hiệu quả?cách tốt nhất để chuyển đổi bộ sưu tập thành chuỗi

Tôi đã làm nó theo cách này tại thời điểm này:

parameters = string.Join("", requestParameters.Select(x => string.Concat(x.Key, x.Value))); 

Nhưng không chắc chắn nó là cách tốt nhất để làm điều đó, sẽ xây dựng một chuỗi được tốt hơn? Tôi đoán bộ sưu tập sẽ chứa tối đa 10 cặp.

+1

Cách của bạn trông đẹp và nhỏ gọn. – tidwall

Trả lời

4

Với bộ sưu tập nhỏ như vậy, không có nhiều mối quan tâm về hiệu suất, nhưng tôi có thể chỉ sử dụng một StringBuilder để Nối tất cả các giá trị.

Như thế này:

var sb = new Text.StringBuilder; 
foreach (var item in requestParameters) 
{ 
    sb.AppendFormat("{0}{1}", item.Key, item.Value); 
} 
var parameters = sb.ToString(); 
+1

Nhưng điều này chỉ là nhân đôi những gì 'string.Join' làm trong nội bộ (OP xuất hiện để được trên .NET 4.0, do đó, ông có quyền truy cập vào quá tải chấp nhận một' IEnumerable '). –

0

Trình tạo chuỗi sẽ ổn. Sử dụng thêm để thêm mỗi chuỗi vào trình tạo chuỗi.

Về cơ bản, lý do duy nhất tại sao concat, replace, join, string + string, vv được coi là không tốt nhất vì tất cả đều có xu hướng hủy chuỗi hiện tại & tạo lại một chuỗi mới.

Vì vậy, khi bạn có thêm chuỗi như tối đa 10-12 thời gian nó thực sự có nghĩa là bạn sẽ phá hủy & tạo lại một chuỗi nhiều lần.

5

string.Join sử dụng để không thực sự là lựa chọn tốt nhất vì nó chỉ chấp nhận string[] hoặc object[] thông số, đòi hỏi rằng bất kỳ select truy vấn kiểu cần phải được hoàn toàn đánh giá và đưa vào một mảng đầu tiên .

.NET 4.0 được mang theo nó an overload that accepts IEnumerable<string> - đó là những gì bạn đang sử dụng - và thậm chí an overload that accepts any IEnumerable<T>. Đây chắc chắn là đặt cược tốt nhất của bạn vì chúng bây giờ là một phần của BCL.

Ngẫu nhiên, nứt mở nguồn cho tình trạng quá tải đầu tiên trong Reflector thấy mã mà sau khá chặt chẽ với what davisoa suggested:

public static string Join(string separator, IEnumerable<string> values) 
{ 
    if (values == null) 
    { 
     throw new ArgumentNullException("values"); 
    } 
    if (separator == null) 
    { 
     separator = Empty; 
    } 
    using (IEnumerator<string> enumerator = values.GetEnumerator()) 
    { 
     if (!enumerator.MoveNext()) 
     { 
      return Empty; 
     } 
     StringBuilder builder = new StringBuilder(); 
     if (enumerator.Current != null) 
     { 
      builder.Append(enumerator.Current); 
     } 
     while (enumerator.MoveNext()) 
     { 
      builder.Append(separator); 
      if (enumerator.Current != null) 
      { 
       builder.Append(enumerator.Current); 
      } 
     } 
     return builder.ToString(); 
    } 
} 

Vì vậy, nói cách khác, nếu bạn đã thay đổi mã này để sử dụng StringBuilder, bạn 'd chỉ được viết lại những gì MS đã viết cho bạn.

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