2010-05-03 4 views
16

Xin chào, tôi muốn lấy bộ sưu tập danh sách và tạo một dòng csv duy nhất. Vì vậy, lấy này;Tạo CSV từ danh sách chuỗi trong LINQ

List<string> MakeStrings() 
{ 
    List<string> results = new List<string>(); 
    results.add("Bob"); 
    results.add("Nancy"); 
    results.add("Joe"); 
    results.add("Jack"); 
    return results;  
} 


string ContactStringsTogether(List<string> parts) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (string part in parts) 
    { 
     if (sb.Length > 0) 
      sb.Append(", "); 

     sb.Append(part); 
    } 
    return sb.ToString(); 
} 

này trả về "Bob, Nancy, Joe, Jack"

Cần sự giúp đỡ về LINQ để làm điều này trong một tuyên bố duy nhất. Cảm ơn!

Trả lời

24

Không có bất kỳ một lớp lót nào để thực hiện việc này với LINQ. Lưu ý rằng bạn có thể sử dụng phương thức Tổng hợp để làm điều này, nhưng bạn sẽ sử dụng chuỗi nối thay vì một StringBuilder. Tôi sẽ cân nhắc việc thêm một phương pháp khuyến nông cho điều này nếu nó một cái gì đó bạn sẽ được làm thường xuyên:

public static string ToCsv<T>(this IEnumerable<T> source) 
    { 
     if (source == null) throw new ArgumentNullException("source"); 
     return string.Join(",", source.Select(s => s.ToString()).ToArray()); 
    } 
+0

Đây chính xác là những gì tôi đang tìm kiếm. Điều này là không cho xây dựng một tập tin CSV của nó chỉ cho joing lên để đưa vào một cái nhìn. Xuất sắc! – CmdrTallen

+0

+1 Tôi chỉ muốn nói .. cool! –

10
var csv = string.Join(",", MakeStrings().ToArray()); 

Cá nhân tôi sẽ khuyên bạn nên sử dụng một thực CSV parser thay vì cố gắng để làm một lót đó sẽ phá vỡ nếu giá trị của bạn có chứa một dấu phẩy ví dụ. Bạn có thể đọc bài viết này về rolling your own CSV parser.

+2

chuỗi str = string.Join (",", MakeStrings()); –

+1

@ user129206 phụ thuộc vào phiên bản .net của bạn. Trong 3.5 hoặc sớm hơn 'string.Join()' chỉ có quá tải mảng. –

2

Bạn có thể sử dụng

String csv = parts.Aggregate((s1,s2) => s1+","+s2); 
4

Sử dụng LINQ để xây dựng một CSV trong một tuyên bố duy nhất có thể không phải là một ý tưởng tuyệt vời - đặc biệt là nếu số lượng dữ liệu là signficant. Chỉ vì một cái gì đó có thể với LINQ không có nghĩa là nó sẽ tự động là cách tốt nhất để làm như vậy.

Tạo chuỗi CSV, theo bản chất, một thao tác yêu cầu ghép nối và tái phân bổ chuỗi. Bạn có thể sử dụng String.Join(), nhưng nó sẽ không tự động thoát khỏi các ký tự như dấu phẩy hoặc dấu ngoặc kép. Trên thực tế, có một số quy tắc không tầm thường là một phần của việc tạo các tệp CSV được định dạng tốt.

Điều bạn nên xem xét thực hiện là sử dụng proven library tạo dữ liệu định dạng CSV chính xác.

Nếu bạn chọn viết bản thực hiện của riêng mình, hãy lưu ý rằng các kỹ thuật liên quan đến nhiều chuỗi (ví dụ như Enumerable.Aggregate() được cung cấp làm ví dụ) có thể dẫn đến nhiều trường hợp chuỗi trung gian. . Bạn có thể vẫn muốn sử dụng một số StringBuilder trong bất kỳ triển khai thực tế nào.

Đôi khi cấu trúc mã rõ ràng và đơn giản nhất vẫn là một vòng lặp.

1

tôi khá nhiều chỉ cần sử dụng chức năng này để tạo ra csv từ LINQ. Không hoàn hảo, nhưng có thể tùy chỉnh.

public string generateCsvFromLinqQueryable(IQueryable query,string delimiter,string replaceDelimiterInDataWith) 
{ 
    PropertyInfo[] rowPropertyInfos = null; 
    rowPropertyInfos = query.ElementType.GetProperties(); 

    string result = ""; 
    foreach (var myObject in query) 
    { 
     foreach (PropertyInfo info in rowPropertyInfos) 
     { 
      if (info.CanRead) 
      { 
       string tmp = Convert.ToString(info.GetValue(myObject, null)); 
       if (!String.IsNullOrEmpty(tmp)) 
       { 
        tmp.Replace(delimiter, replaceDelimiterInDataWith); 
       } 
       result += tmp + delimiter; 
      } 
     } 
     result += "\r\n"; 
    } 
    return result; 
} 

Harry

1

Trong .net 4.0,

string str = string.Join(", ", MakeStrings()); 

Thêm câu trả lời của tôi ở đây như một riêng biệt, do đó nó sẽ được rõ ràng hơn cho độc giả, không rõ ràng trong ý kiến ​​của tôi dưới Darin Dimitrov's câu trả lời.