LINQ kullanarak bir Liste <string> içindeki tüm dizeleri kapat


543

List<string>Koleksiyon öğelerimin tamamını stringsınırlayıcı karaktere sahip tek bir öğeyle birleştirmek için herhangi bir kolay LINQ ifadesi var mı ?

Koleksiyon yerine özel nesnelerden oluşuyorsa ne olur string? Birleştirmem gerektiğini hayal et object.Name.


37
Neden linq ve string.Join () değil?
Alan

14
string.Join daha iyi ama linq kodunuzu eğlenceli hale getirir, bu yüzden olabilir!
Ali Ersöz

14
String.Join, StringBuilder kullandığından ve yinelenen birleştirmenin içsel O (n ^ 2) performansından kaçındığı için daha iyidir.
Kennet Belenky

1
kullanarak performans sorunları?
PreguntonCojoneroCabrón

Yanıtlar:


525

LINQ kullanarak, bu çalışması gerekir;

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

sınıf açıklaması:

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

Kullanımı:

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

    }
}

Ve işte elimden geleni :)

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

40
O (n ^ 2) zamanı tekrar vurur.
Kennet Belenky

2
Aggregate yöntemini göremiyorsanız, System.Linq kullanarak eklemeniz gerekir;
Cédric Guillemette

6
Sorun yukarıdaki LinQ yönteminin boş veya tek öğeli listeyle çalışmaz olmasıdır.
Alexander

2
öğelerin boş olması durumunda InvalidOperationException kurar.
2xMax

10
neden sadece string.join kullanmıyorsunuz? Lütfen Sedat'ın yanıtını kabul edin, böylece Sedat'ın daha iyi bir seçim olduğu durumlarda acele eden herkes bu çözümü seçmez.
Skychan

966

.NET 4.0 veya sonraki sürümlerde:

String.Join(delimiter, list);

yeterlidir.


91
Ben tüm LINQ çözümleri için değilim ama bu LINQ ve Aggregate () yönteminden daha etkilidir.
andleer

17
çok daha temiz! benim için harika çalıştı! string.Join (",", accs. (x => x.AccountID) .ToArray ()),
m4tt1mus

32
@KonstantinSalavatov OP'nin LINQ'da olması gerektiğini açıklığa kavuşturmadan önce cevabımı gönderdim. Google'da "zorunlu olarak LINQ" çözümü ararken bu yanıta çarpışan herkes için hala mükemmel bir şekilde geçerlidir. Bu cevaba ilişkin olarak, bu bağlamda "yararlı değil" haksızlıktır.
Sedat Kapanoglu

7
Bu, List <String>s dışındaki şeyler için de kullanılabilir ve ToString () yöntemini çağırır.
Kian

Bu, veritabanına giden bir sorgu ise çalışmaz. Sadece bellekte çalışır.
1919

124

Bu bir dize dizisi içindir:

string.Join(delimiter, array);

Bu <string> Listesi içindir:

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

Ve bu özel nesnelerin listesi için:

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

25
String.Join, IEnumerable alan bir aşırı yüklemeye sahiptir, bu nedenle ToArray () çağrısına ihtiyacınız yoktur
arolson101

9
IEnumerable aşırı yükünün yalnızca 4.0 veya sonraki sürümlerde bulunduğunu unutmayın. Eski bir sürüm kullanıyorsanız yine de ToArray () gerekir.
Rakuen42

2
Ah! Bu son aşırı yük aradığım şeydi. Belirli bir mülkü elde etmenin bir yolu olması gerektiğini biliyordum. :)
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

İyi soru. Kullanıyorum

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

LINQ değil, ama işe yarıyor.


Neden .ToArray () öğesini çağırmalısınız?
Ε Г И І И О

Çünkü 2009 yılının kötü günlerinde dize.Join'in IEnumerable kabul eden bir uzantısı yoktu.
Jacob Proffitt

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

7

Mantık bir uzantı yönteminde tanımlarsanız, kod çok daha okunabilir olacağını düşünüyorum:

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

Sadece şunu kullanabilirsiniz:

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

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

Mutlu kodlama!


3

LINQ kullanarak bunu yaptım:

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

string joinedString = string.Join(",", oCSP.Select(p => p.ProductName));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.