Chuyển đổi danh sách thành một chuỗi trong C #


184

Làm cách nào để chuyển đổi danh sách thành chuỗi trong C #?

Khi tôi thực thi toStringtrên một đối tượng List, tôi nhận được:

System.Collections.Generic.List`1 [System.String]


1
Danh sách là một bộ sưu tập, chuỗi này được cho là trông như thế nào?
Marko

Bạn có thể thử bất kỳ một trong ba cách được đề cập ở đây .
RBT

Câu trả lời:


363

Có lẽ bạn đang cố gắng làm

string combindedString = string.Join( ",", myList.ToArray() );

Bạn có thể thay thế "," bằng những gì bạn muốn chia các phần tử trong danh sách.

Chỉnh sửa : Như đã đề cập trong các ý kiến ​​bạn cũng có thể làm

string combindedString = string.Join( ",", myList);

Tài liệu tham khảo:

Join<T>(String, IEnumerable<T>) 
Concatenates the members of a collection, using the specified separator between each member.

4
bạn có nghĩa là chuỗi combindedString = string.Join (",", myList.ToArray ());
cưa

2
Đối số '2': không thể chuyển đổi từ 'System.Collections.Generic.List <string>' thành 'chuỗi []'
Ash

9
Tôi đã sử dụng cái này gần đây, nó hoạt động - chỉ cần bỏ qua .ToArray ()
Adrian K

3
@AdrianK bạn đúng vì .Net 4.0 đã thêm khả năng vượt qua trong bất kỳ <chuỗi> IEnumerable nào. Tuy nhiên 4.0 đã được phát hành vào tháng 4 năm 2010, trước khi câu hỏi và câu trả lời này được đăng lên nên có lẽ mọi người ở đây vẫn chưa biết về nó (ngoài một vài điều dưới đây)
Andrew Steitz

Đối với vb.net, Dim combindedString As String = String.Join (",", myList.ToArray ())
PartTimeNerd

55

Tôi sẽ đi với cảm giác ruột của mình và cho rằng bạn muốn kết hợp kết quả của việc gọi ToStringtrên từng thành phần của danh sách.

var result = string.Join(",", list.ToArray());

16

Bạn có thể sử dụng string.Join:

List<string> list = new List<string>()
{
    "Red",
    "Blue",
    "Green"
};

string output = string.Join(Environment.NewLine, list.ToArray());    
Console.Write(output);

Kết quả sẽ là:

Red    
Blue    
Green

Thay thế cho Environment.NewLine, bạn có thể thay thế nó bằng một dấu phân cách dòng dựa trên chuỗi bạn chọn.


14

Nếu bạn muốn một cái gì đó phức tạp hơn một chút so với tham gia đơn giản, bạn có thể sử dụng LINQ, vd

var result = myList.Aggregate((total, part) => total + "(" + part.ToLower() + ")");

Sẽ lấy ["A", "B", "C"] và tạo ra "(a) (b) (c)"


1
Sử dụng Tổng hợp với một hạt giống làm tham số đầu tiên để tránh ném UnlimitedOperationException cho các bộ sưu tập trống.
Huacanacha

13

String.Join(" ", myList)hoặc String.Join(" ", myList.ToArray()). Đối số đầu tiên là dấu phân cách giữa các chuỗi con.

var myList = new List<String> { "foo","bar","baz"};
Console.WriteLine(String.Join("-", myList)); // prints "foo-bar-baz"

Tùy thuộc vào phiên bản .NET của bạn, trước tiên bạn có thể cần sử dụng ToArray () trong danh sách ..


9

Bạn có một List<string>- vì vậy nếu bạn muốn chúng được nối, một cái gì đó như

string s = string.Join("", list);

sẽ hoạt động (trong .NET 4.0 ít nhất). Tham số đầu tiên là dấu phân cách. Vì vậy, bạn cũng có thể dấu phẩy, vv

Bạn cũng có thể muốn xem xét việc sử dụng StringBuilder để thực hiện chạy ghép, thay vì tạo một danh sách.


8

Các .ToString()phương pháp với nhiều loại tài liệu tham khảo thường giải quyết trở lại System.Object.ToString()trừ khi bạn ghi đè lên nó trong một loại hình xuất phát (có thể sử dụng phương pháp khuyến nông cho các built-in loại). Hành vi mặc định cho phương thức này là xuất tên của loại mà nó được gọi. Vì vậy, những gì bạn đang thấy là hành vi dự kiến.

Bạn có thể thử một cái gì đó như string.Join(", ", myList.ToArray());để đạt được điều này. Đó là một bước bổ sung, nhưng nó có thể được đưa vào một phương thức mở rộng System.Collections.Generic.List<T>để làm cho nó dễ dàng hơn một chút. Một cái gì đó như thế này:

public static class GenericListExtensions
{
    public static string ToString<T>(this IList<T> list)
    {
        return string.Join(", ", list);
    }
}

(Lưu ý rằng đây là mã tự do và chưa được kiểm tra. Tôi không có trình biên dịch tiện dụng vào lúc này. Vì vậy, bạn sẽ muốn thử nghiệm nó một chút.)


nó hoạt động khi tôi gọi nó không phải là ToString hoặc thực thi nó với tham số chung. Nhưng tôi thích ý tưởng của bạn về việc sử dụng phương thức mở rộng :)
IAd CHƯƠNG

4

Thật khó để nói, nhưng có lẽ bạn đang tìm kiếm một cái gì đó như:

var myString = String.Join(String.Empty, myList.ToArray());

Điều này sẽ ngầm gọi phương thức ToString () trên mỗi mục trong danh sách và nối chúng.


1
String.Concat()sẽ đạt được điều tương tự tốt hơn.
Jeff Mercado


2

Nếu bạn đang muốn biến các mục trong danh sách thành một chuỗi dài lớn, hãy làm điều này : String.Join("", myList). Một số phiên bản cũ hơn của khung không cho phép bạn vượt qua IEnumerable làm tham số thứ hai, vì vậy bạn có thể cần phải chuyển đổi danh sách của mình thành một mảng bằng cách gọi .ToArray ().


2

Câu trả lời trực tiếp cho câu hỏi của bạn là String.Joinnhư những người khác đã đề cập.

Tuy nhiên, nếu bạn cần một số thao tác, bạn có thể sử dụng Aggregate:

List<string> employees = new List<string>();
employees.Add("e1");
employees.Add("e2");
employees.Add("e3");

string employeesString = "'" + employees.Aggregate((x, y) => x + "','" + y) + "'";
Console.WriteLine(employeesString);
Console.ReadLine();

1
trong mã sản xuất, đảm bảo danh sách của bạn có bất kỳ yếu tố nào nếu không nó sẽ ném ngoại lệ.
AZ_

1

Phương pháp này đã giúp tôi khi cố gắng truy xuất dữ liệu từ Tệp văn bản và lưu trữ nó trong Mảng sau đó Gán nó vào một chuỗi có sẵn.

string[] lines = File.ReadAllLines(Environment.CurrentDirectory + "\\Notes.txt");  
string marRes = string.Join(Environment.NewLine, lines.ToArray());

Hy vọng có thể giúp được ai đó !!!!


0

Điều này dường như làm việc cho tôi.

var combindedString = new string(list.ToArray());

0

tất cả các câu trả lời ở trên KHÔNG hoạt động cho các danh sách lồng nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.