Kết hợp tất cả các chuỗi trong Danh sách <chuỗi> bằng LINQ


543

Có biểu thức LINQ nào dễ dàng để ghép toàn List<string>bộ các mục bộ sưu tập của tôi thành một stringký tự phân cách không?

Điều gì nếu bộ sưu tập là của các đối tượng tùy chỉnh thay vì string? Hãy tưởng tượng tôi cần phải nối lại object.Name.


37
Tại sao linq mà không phải chuỗi.Join ()?
Alan

14
chuỗi.Join tốt hơn nhưng tôi nghĩ linq làm cho mã của bạn vui, đó có thể là lý do!
Ali Ersöz

14
String.Join tốt hơn bởi vì nó sử dụng StringBuilder và tránh hiệu suất O (n ^ 2) không liên tục của phép nối lặp lại.
Kennet Belenky

1
vấn đề hiệu suất sử dụng LINQ?
PreguntonCojoneroCabrón

Câu trả lời:


525

Bằng cách sử dụng LINQ, điều này sẽ hoạt động;

string delimiter = ",";
List<string> items = new List<string>() { "foo", "boo", "john", "doe" };
Console.WriteLine(items.Aggregate((i, j) => i + delimiter + j));

mô tả lớp học:

public class Foo
{
    public string Boo { get; set; }
}

Sử dụng:

class Program
{
    static void Main(string[] args)
    {
        string delimiter = ",";
        List<Foo> items = new List<Foo>() { new Foo { Boo = "ABC" }, new Foo { Boo = "DEF" },
            new Foo { Boo = "GHI" }, new Foo { Boo = "JKL" } };

        Console.WriteLine(items.Aggregate((i, j) => new Foo{Boo = (i.Boo + delimiter + j.Boo)}).Boo);
        Console.ReadKey();

    }
}

Và đây là điều tốt nhất của tôi :)

items.Select(i => i.Boo).Aggregate((i, j) => i + delimiter + j)

40
O (n ^ 2) lại đình công.
Kennet Belenky

2
Nếu bạn không thể thấy phương thức Tổng hợp, bạn cần thêm bằng System.Linq;
Cédric Guillemette

6
Vấn đề là phương pháp LinQ ở trên không hoạt động với danh sách phần tử rỗng hoặc đơn.
Alexander

2
nó sẽ ném một UnlimitedOperationException trong trường hợp các mục trống.
2xMax

10
Tại sao không chỉ sử dụng chuỗi.join? Vui lòng chấp nhận câu trả lời của Sedat để bất cứ ai vội vàng không chọn giải pháp này khi Sedat là lựa chọn tốt hơn.
Skychan

966

Trong phiên bản .NET 4.0 trở lên:

String.Join(delimiter, list);

là đủ.


91
Tôi là tất cả cho các giải pháp LINQ nhưng điều này hiệu quả hơn so với phương pháp LINQ và phương pháp Tổng hợp ().
andleer

17
sạch sẽ hơn nhiều làm việc tuyệt vời cho tôi chuỗi.Join (",", accs.Select (x => x.AccountID) .ToArray ()),
m4tt1mus

32
@KonstantinSalavatov Tôi đã đăng câu trả lời của mình trước khi OP làm rõ rằng nó phải ở trong LINQ. Nó vẫn hoàn toàn hợp lệ cho bất kỳ ai gặp phải câu trả lời này trong khi tìm kiếm giải pháp "không nhất thiết-LINQ" trên Google. Về câu trả lời này "không hữu ích" trong bối cảnh đó là không công bằng.
Sedat Kapanoglu

7
Điều này cũng có thể được sử dụng cho những thứ khác ngoài Danh sách <String>và sẽ gọi phương thức ToString ().
Kian

không hoạt động nếu đây là một truy vấn đi đến cơ sở dữ liệu. Nó chỉ hoạt động trên bộ nhớ.
alansiqueira27

124

Đây là một mảng chuỗi:

string.Join(delimiter, array);

Đây là danh sách <chuỗi>:

string.Join(delimiter, list.ToArray());

Và đây là danh sách các đối tượng tùy chỉnh:

string.Join(delimiter, list.Select(i => i.Boo).ToArray());

25
String.Join có một tình trạng quá tải cần một IEnumerable, vì vậy bạn không cần cuộc gọi ToArray ()
arolson101

9
Hãy nhớ rằng quá tải IEnumerable chỉ tồn tại trong 4.0 trở lên. Nếu bạn đang sử dụng phiên bản cũ hơn, bạn vẫn sẽ cần ToArray ().
Rakuen42

2
Ah! Sự quá tải cuối cùng đó là thứ tôi đang tìm kiếm. Tôi biết rằng phải có một cách để trích xuất một tài sản cụ thể. :)
Mike Devenney

56
using System.Linq;

public class Person
{
  string FirstName { get; set; }
  string LastName { get; set; }
}

List<Person> persons = new List<Person>();

string listOfPersons = string.Join(",", persons.Select(p => p.FirstName));

26

Câu hỏi hay. Tôi đã sử dụng

List<string> myStrings = new List<string>{ "ours", "mine", "yours"};
string joinedString = string.Join(", ", myStrings.ToArray());

Đó không phải là LINQ, nhưng nó hoạt động.


Tại sao bạn phải gọi .ToArray ()?
Ε é И

Bởi vì trở lại vào những ngày ole tồi tệ của năm 2009, chuỗi.Join đã không có tiện ích mở rộng chấp nhận IEnumerable.
Jacob Proffitt

8
List<string> strings = new List<string>() { "ABC", "DEF", "GHI" };
string s = strings.Aggregate((a, b) => a + ',' + b);

7

Tôi nghĩ rằng nếu bạn xác định logic trong một phương thức mở rộng, mã sẽ dễ đọc hơn nhiều:

public static class EnumerableExtensions { 
  public static string Join<T>(this IEnumerable<T> self, string separator) {  
    return String.Join(separator, self.Select(e => e.ToString()).ToArray()); 
  } 
} 

public class Person {  
  public string FirstName { get; set; }  
  public string LastName { get; set; }  
  public override string ToString() {
    return string.Format("{0} {1}", FirstName, LastName);
  }
}  

// ...

List<Person> people = new List<Person>();
// ...
string fullNames = people.Join(", ");
string lastNames = people.Select(p => p.LastName).Join(", ");

6

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

List<string> items = new List<string>() { "foo", "boo", "john", "doe" };

Console.WriteLine(string.Join(",", items));

Chúc mừng mã hóa!


3

Tôi đã thực hiện điều này bằng cách sử dụng LINQ:

var oCSP = (from P in db.Products select new { P.ProductName });

string joinedString = string.Join(",", oCSP.Select(p => p.ProductName));
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.