2008-10-31 64 views
42

này có thể có một câu trả lời đơn giản, nhưng tôi không có đủ cà phê để con nó ra trên của riêng tôi:Trong C#: Thêm dấu ngoặc kép quanh chuỗi trong một dấu phẩy phân cách danh sách các chuỗi

Nếu tôi đã quyết dấu phẩy phân cách chuỗi như:

string list = "Fred,Sam,Mike,Sarah"; 

làm thế nào sẽ nhận được mỗi phần tử và thêm dấu ngoặc kép quanh nó và dính nó trở lại trong một chuỗi như thế này:

string newList = "'Fred','Sam','Mike','Sarah'"; 

tôi giả định iterating trên mỗi người sẽ là một sự khởi đầu , nhưng Tôi đã bị bối rối sau đó.

Một giải pháp mà là xấu xí:

int number = 0; 
string newList = ""; 
foreach (string item in list.Split(new char[] {','})) 
{ 
    if (number > 0) 
    { 
     newList = newList + "," + "'" + item + "'"; 
    } 
    else 
    { 
     newList = "'" + item + "'"; 
    } 
    number++; 
} 
+0

tôi chắc chắn rằng ai đó có một câu trả lời Regex này. Tôi nghĩ rằng đó sẽ là cách để làm điều này, nhưng tôi không lên trên regexs của tôi sáng nay hoặc .. – Codewerks

+0

Không, tôi nghĩ rằng FOR có giải pháp đơn giản nhất ... Hãy nhớ rằng, với regexes, bây giờ bạn có hai vấn đề . :) http://www.codinghorror.com/blog/archives/001016.html –

Trả lời

69
string s = "A,B,C"; 
string replaced = "'"+s.Replace(",", "','")+"'"; 

Cám ơn ý kiến, tôi đã bỏ lỡ các dấu ngoặc kép bên ngoài.

Tất nhiên .. nếu nguồn là một chuỗi rỗng, bạn có muốn thêm dấu ngoặc kép xung quanh nó hay không? Và nếu đầu vào là một loạt các khoảng trắng ...? Ý tôi là, để đưa ra một giải pháp hoàn chỉnh 100%, tôi có thể yêu cầu một danh sách các bài kiểm tra đơn vị nhưng tôi hy vọng bản năng ruột của tôi đã trả lời câu hỏi cốt lõi của bạn.

Cập nhật: Một lựa chọn LINQ dựa trên cũng đã được đề nghị (với lợi ích bổ sung của việc sử dụng String.Format và do đó không cần phải lo lắng về hàng đầu/dấu ngoặc kép trailing):

string list = "Fred,Sam,Mike,Sarah"; 
string newList = string.Join(",", list.Split(',').Select(x => string.Format("'{0}'", x)).ToList()); 
+0

Điều đó đơn giản hóa nó một chút. Người ta chỉ cần thêm dấu ngoặc kép vào đầu và cuối của chuỗi để kết thúc nó. –

+1

Bạn cũng cần phải thêm dấu nháy đơn vào đầu và cuối của chuỗi. – Maxam

+0

Điều đó sẽ cung cấp cho bạn "Fred ',' Sam ',' Mike ',' Sarah"; – Codewerks

15
string[] splitList = list.Split(','); 
string newList = "'" + string.Join("','", splitList) + "'"; 
+0

Tôi thích nó cho sự thông minh, nhưng khó hiểu hơn (trong đó không đơn giản) như trích dẫn từng chuỗi và nối lại với dấu phẩy. Tốt đẹp anyway mặc dù :) –

+0

Tôi thích câu trả lời này nhiều hơn một lựa chọn. Cảm ơn! – CleanBold

+0

Tôi nghĩ rằng cách này bạn nhận được, trong một số trường hợp, một chuỗi rỗng ('') ở cuối chuỗi đầu ra của bạn. Nó có thể không phải luôn luôn là giải pháp tốt nhất cho những trường hợp này. –

20
string[] bits = list.Split(','); // Param arrays are your friend 
for (int i=0; i < bits.Length; i++) 
{ 
    bits[i] = "'" + bits[i] + "'"; 
} 
return string.Join(",", bits); 

Hoặc bạn có thể sử dụng LINQ, đặc biệt với phiên bản String.Join hỗ trợ IEnumerable<string> ...

return list.Split(',').Select(x => "'" + x + "'").JoinStrings(","); 

Có một triển khai JoinStrings ở nơi khác trên SO ... Tôi sẽ tìm kiếm nó.

EDIT: Vâng, đó là không hoàn toàn JoinStrings Tôi đã nghĩ đến, vì vậy ở đây là:

public static string JoinStrings<T>(this IEnumerable<T> source, 
            string separator) 
{ 
    StringBuilder builder = new StringBuilder(); 
    bool first = true; 
    foreach (T element in source) 
    { 
     if (first) 
     { 
      first = false; 
     } 
     else 
     { 
      builder.Append(separator); 
     } 
     builder.Append(element); 
    } 
    return builder.ToString(); 
} 

Những ngày string.Join có một tình trạng quá tải chung thay vì mặc dù, vì vậy bạn chỉ có thể sử dụng:

return string.Join(",", list.Split(',').Select(x => $"'{x}'")); 
+0

Tôi đang cố gắng sử dụng phương pháp của bạn và nhận được 'khai báo tham số kiểu phải là một định danh không phải là một loại'. Lớp mở rộng của tôi được khai báo là 'public static class Extensions'. Đây có phải là nguyên nhân không? – user919426

+1

@ user919426: Không, nó đã bị hỏng. Tôi đã sửa nó ngay bây giờ. –

+0

Xin lỗi vì câu trả lời trễ, nhưng cảm ơn @Jon Skeet – user919426

2

tôi không thể viết code C#, nhưng mã JavaScript đơn giản này có lẽ là dễ dàng để thích ứng:

var s = "Fred,Sam,Mike,Sarah"; 
alert(s.replace(/\b/g, "'")); 

Nó chỉ thay thế giới hạn (bắt đầu/kết thúc chuỗi, chuyển đổi từ ký tự từ không dấu chấm câu) bằng dấu nháy đơn.

4

Tôi nghĩ rằng điều đơn giản nhất sẽ là Split và sau đó Join.

string nameList = "Fred,Sam,Mike,Sarah"; 
string[] names = nameList.Split(','); 
string quotedNames = "'" + string.Join("','", names) + "'"; 
1
string list = "Fred,Sam,Mike,Sarah"; 

string[] splitList = list.Split(','); 

for (int i = 0; i < splitList.Length; i++) 
    splitList[i] = String.Format("'{0}'", splitList[i]); 

string newList = String.Join(",", splitList); 
0

C# thực hiện @PhiLho 's JavaScript giải pháp biểu hiện thường xuyên trông giống như sau:

Regex regex = new Regex(
    @"\b", 
    RegexOptions.ECMAScript 
    | RegexOptions.Compiled 
    ); 

string list = "Fred,Sam,Mike,Sarah"; 
string newList = regex.Replace(list,"'"); 
+0

Lưu ý rằng giải pháp này không thành công là các mục có dấu cách trong đó. Trong trường hợp đó, giải pháp vòng lặp for bắt đầu trông sạch hơn rất nhiều. – bdukes

0

của tôi "ít phức tạp" cách tiếp cận ... Tôi cho rằng nó luôn luôn tốt thực hành sử dụng StringBuilder vì danh sách có thể rất lớn.

string list = "Fred,Sam,Mike,Sarah"; 
StringBuilder sb = new StringBuilder(); 

string[] listArray = list.Split(new char[] { ',' }); 

for (int i = 0; i < listArray.Length; i++) 
{ 
    sb.Append("'").Append(listArray[i]).Append("'"); 
    if (i != (listArray.Length - 1)) 
     sb.Append(","); 
} 
string newList = sb.ToString(); 
Console.WriteLine(newList); 
0

Bạn có đang xử lý nhiều CSV không? Nếu vậy, bạn cũng nên cân nhắc sử dụng thư viện để thực hiện việc này. Đừng sáng tạo lại bánh xe. Thật không may tôi đã không tìm thấy một thư viện khá đơn giản như thư viện CSV của Python, nhưng tôi đã thấy FileHelpers (miễn phí) reviewed at MSDN Magazine và có vẻ khá tốt. Có thể có các thư viện miễn phí khác ngoài đó. Tất cả phụ thuộc vào việc bạn xử lý bao nhiêu. Thường thì nó phát triển và phát triển cho đến khi bạn nhận ra rằng bạn sẽ sử dụng thư viện tốt hơn.

14

Làm theo ví dụ của Jon Skeet ở trên, đây là những gì phù hợp với tôi. Tôi đã có một List<String> biến gọi là __messages vì ​​vậy đây là những gì tôi đã làm:

string sep = String.Join(", ", __messages.Select(x => "'" + x + "'")); 
1

Nếu bạn đang sử dụng JSON, chức năng sau đây sẽ giúp

var string[] keys = list.Split(','); 
console.log(JSON.stringify(keys)); 
1

Yêu cầu của tôi:

  1. mục riêng sử dụng dấu phẩy.
  2. Bao gồm tất cả các mục trong danh sách trong dấu ngoặc kép.
  3. Thoát dấu ngoặc kép hiện có trong chuỗi.
  4. Xử lý chuỗi rỗng để tránh lỗi.
  5. Đừng bận tâm bao bọc các chuỗi rỗng trong dấu ngoặc kép.
  6. Chấm dứt bằng dòng vận chuyển và trả lại dòng.

    chuỗi.Join (",", lCol.Select (s => s == null? Null: ("\" "+ s.Replace (" \ "", "\" \ "") + " \ ""))) + "\ r \ n";

0

Dưới đây là một giải pháp C# 6 sử dụng string Interpolation

string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
         .Select(x => $"'{x}'") 
         .ToList()); 

Hoặc, nếu bạn thích các tùy chọn C# 5 với string.. Định dạng:

string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
         .Select(x => String.Format("'{0}'", x)) 
         .ToList()); 

Sử dụng StringSplitOptions sẽ r xóa bất kỳ giá trị trống nào để bạn không có bất kỳ dấu ngoặc kép trống nào, nếu đó là điều bạn đang cố tránh.

0

Tôi đã tìm thấy một giải pháp mới cho vấn đề này

Tôi gắn một danh sách các giá trị mục đã chọn từ lưới điện sử dụng LINQ, sau đó thêm một dấu phẩy phân cách chuỗi cho mỗi chuỗi bộ sưu tập bằng cách sử dụng String.Join() tính .

String str1 = String.Empty; 
String str2 = String.Empty;    
//str1 = String.Join(",", values); if you use this method,result "X,Y,Z" 
    str1 =String.Join("'" + "," + "'", values); 
//The result of str1 is "X','Y','Z" 
    str2 = str1.Insert(0, "'").Insert(str1.Length+1, "'"); 
//The result of str2 is 'X','Y','Z' 

Tôi hy vọng điều này sẽ hữu ích !!!!!!

0

Đối với những người yêu thích phương pháp khuyến nông như tôi, ở đây là:

public static string MethodA(this string[] array, string seperatedCharecter = "|") 
    { 
     return array.Any() ? string.Join(seperatedCharecter, array) : string.Empty; 
    } 

    public static string MethodB(this string[] array, string seperatedChar = "|") 
    { 
     return array.Any() ? MethodA(array.Select(x => $"'{x}'").ToArray(), seperatedChar) : string.Empty; 
    } 
Các vấn đề liên quan