2010-08-05 24 views
25

Tôi có một DataTable trả vềIEnumerable để chuỗi

IDs 
,1 
,2 
,3 
,4 
,5 
,100 
,101 

Tôi muốn chuyển đổi này để chuỗi giá trị duy nhất, ví dụ:

,1,2,3,4,5,100,101 

Làm thế nào tôi có thể viết lại như sau để có được một chuỗi đơn

var _values = _tbl.AsEnumerable().Select(x => x); 
+2

Không rõ - dữ liệu nào được returened? Bạn có DataRows và một cột ID không? Ngoài ra, có sự nhầm lẫn trên dấu phẩy - có thể chúng tồn tại trong cơ sở dữ liệu và đã có mặt hay bạn nên thêm chúng? – Kobi

+0

Cảm ơn tất cả các bạn đã tận tình một cách tốt bụng – user160677

+5

'Chọn (x => x);' làm cho hoàn toàn không có ý nghĩa, đặc biệt là trong trường hợp của bạn – abatishchev

Trả lời

64
var singleString = string.Join(",", _values.ToArray()); 
+1

Bạn có cần gọi ToArray() trên _values ​​không? –

+2

Giải pháp đơn giản nhất, tôi chuẩn bị trả lời câu hỏi đó nhưng bạn cần thêm .ToArray() vào _values. –

+0

Thật vậy. Đã cập nhật câu trả lời. –

2

Hãy thử cách này:

var _values = _tbl.AsEnumerable().Select(x => x); 
string valueString = _values.ToList().Aggregate((a, b) => a + b); 
+0

Bạn quên dấu phân cách. a + dấu phân cách + b –

+2

Không có dấu phân tách được yêu cầu bởi OP – cjk

+3

+1 nhưng tại sao hai bước và gọi đến 'ToList'? Tại sao không chỉ '_tbl.AsEnumerable(). Chọn (x => x) .Đăng ký ((a, b) => a + b);'? –

8

Viết một phương pháp khuyến nông như

public static String AppendAll(this IEnumerable<String> collection, String seperator) 
{ 
    using (var enumerator = collection.GetEnumerator()) 
    { 
     if (!enumerator.MoveNext()) 
     { 
      return String.Empty; 
     } 

     var builder = new StringBuilder().Append(enumerator.Current); 

     while (enumerator.MoveNext()) 
     { 
      builder.Append(seperator).Append(enumerator.Current); 
     } 

     return builder.ToString(); 
    } 
} 

và giả sử kết quả của biểu trước đó của bạn là IEnumerable < Chuỗi >, hãy gọi:

var _values = _tbl.AsEnumerable().Select(x => x).AppendAll(String.Empty);  
+0

Xin lỗi cho các tính năng bổ sung trong phương thức mở rộng đó - đó là phương pháp tôi thường sử dụng để nối các chuỗi với nhau phù hợp với trường hợp này. –

+1

Và tại sao các downvote - Tôi biết có thêm những thứ trong đó có thể không cần thiết cho câu hỏi, nhưng nó hoạt động. –

+0

@Alex - khung công tác có chuỗi.Join, mà bạn có thể thấy hữu ích. Xem http://msdn.microsoft.com/en-us/library/57a79xd0.aspx –

-1

Bạn có thể lừa gạt với điều này:

String output = ""; 
_tbl.AsEnumerable().Select(x => output += x).ToArray(); 
// output now contains concatenated string 

Lưu ý ToArray() hoặc tương tự là cần thiết để buộc truy vấn thực thi.

lựa chọn khác là

String output = String.Concat(_tbl.AsEnumerable().Select(x=>x).ToArray()); 
+0

@Winston - Không có dấu phân cách bắt buộc, đọc lại câu hỏi. – cjk

+0

Tùy chọn thứ hai: 'String output = String.Concat (_tbl.AsEnumerable(). ToArray());' sẽ làm tương tự, không? (không có 'Chọn') –

4
String.Join(
     ",", 
     _tbl.AsEnumerable() 
      .Select(r => r.Field<int>("ID").ToString()) 
      .ToArray()) 
2

Bạn có thể sử dụng MoreLINQ mở rộng

var singleString = _values.ToDelimitedString(","); 
1

Tôi đã có một vấn đề tương tự với tổng Array loại và tôi giải quyết nó như sau

string GetMembersAsString(Array array) 
{ 
    return string.Join(",", array.OfType<object>()); 
} 

Lưu ý rằng cuộc gọi OfType<object>() là bắt buộc.

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