Concat semua string di dalam Daftar <string> menggunakan LINQ


543

Apakah ada ekspresi LINQ yang mudah untuk menggabungkan seluruh List<string>item koleksi saya menjadi satu stringdengan karakter pembatas?

Bagaimana jika koleksi adalah objek khusus, bukan string? Bayangkan saya harus menyatukan object.Name.


37
Mengapa LINQ dan bukan string.Join ()?
Alan

14
string.Join lebih baik tapi saya pikir linq membuat kode Anda menyenangkan, itu bisa menjadi alasannya!
Ali Ersöz

14
String.Join lebih baik karena menggunakan StringBuilder dan menghindari kinerja O yang inheren (n ^ 2) dari rangkaian berulang.
Kennet Belenky

1
masalah kinerja menggunakan LINQ?
PreguntonCojoneroCabrón

Jawaban:


525

Dengan menggunakan LINQ, ini seharusnya bekerja;

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

deskripsi kelas:

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

Pemakaian:

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();

    }
}

Dan inilah yang terbaik :)

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

40
O (n ^ 2) waktu menyerang lagi.
Kennet Belenky

2
Jika Anda tidak dapat melihat metode Agregat, Anda perlu menambahkan menggunakan System.Linq;
Cédric Guillemette

6
Masalahnya adalah bahwa metode LinQ di atas tidak berfungsi dengan daftar elemen kosong atau tunggal.
Alexander

2
itu akan melempar InvalidOperationException dalam kasus item kosong.
2xMax

10
mengapa tidak menggunakan string.join saja? Harap terima jawaban Sedat sehingga siapa pun yang terburu-buru tidak memilih solusi ini ketika Sedat adalah pilihan yang lebih baik.
Skychan

966

Dalam versi .NET 4.0 atau yang lebih baru:

String.Join(delimiter, list);

Cukup.


91
Saya semua untuk solusi LINQ tapi ini lebih efisien daripada LINQ dan metode Agregat ().
andleer

17
lebih bersih! bekerja sangat baik untuk saya! string.Join (",", accs.Select (x => x.AccountID) .ToArray ()),
m4tt1mus

32
@KonstantinSalavatov Saya telah mengirim jawaban saya sebelum OP mengklarifikasi bahwa itu harus di LINQ. Itu masih berlaku untuk siapa saja yang menabrak jawaban ini sambil mencari solusi "tidak-harus-LINQ" di Google. Mengenai jawaban ini "tidak berguna" dalam konteks itu tidak adil.
Sedat Kapanoglu

7
Ini juga dapat digunakan untuk hal-hal selain Daftar <String>dan akan memanggil metode ToString ().
Kian

tidak berfungsi jika ini adalah permintaan pergi ke database. Ini hanya bekerja pada memori.
alansiqueira27

124

Ini untuk array string:

string.Join(delimiter, array);

Ini untuk Daftar <string>:

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

Dan ini untuk daftar objek khusus:

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

25
String.Join memiliki kelebihan yang membutuhkan IEnumerable, jadi Anda tidak perlu panggilan ToArray ()
arolson101

9
Ingatlah bahwa kelebihan IEnumerable hanya ada di 4.0 atau lebih baru. Jika Anda menggunakan versi yang lebih lama, Anda masih perlu ToArray ().
Rakuen42

2
Ah! Kelebihan terakhir adalah yang saya cari. Saya tahu harus ada cara untuk mengekstraksi properti tertentu. :)
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

Pertanyaan bagus. Saya sudah menggunakan

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

Ini bukan LINQ, tetapi berhasil.


Mengapa Anda harus memanggil .ToArray ()?
Ε Г И І И О

Karena kembali pada hari-hari buruk 2009, string.Join tidak memiliki ekstensi yang menerima IEnumerable.
Jacob Proffitt

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

7

Saya pikir jika Anda mendefinisikan logika dalam metode ekstensi kode akan jauh lebih mudah dibaca:

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

Anda cukup menggunakan:

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

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

Selamat coding!


3

Saya telah melakukan ini menggunakan LINQ:

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

string joinedString = string.Join(",", oCSP.Select(p => p.ProductName));
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.