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.

Jobi Joy
sumber
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)
Ali Ersöz
sumber
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.

Sedat Kapanoglu
sumber
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());
Alexander Prokofyev
sumber
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));
dev.bv
sumber
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.

Jacob Proffitt
sumber
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);
Peter McG
sumber
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(", ");
Jordão
sumber
6

Anda cukup menggunakan:

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

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

Selamat coding!

Nishanth Shaan
sumber
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));
Biddut
sumber