Укладіть всі рядки всередині списку <string> за допомогою LINQ


542

Чи є який-небудь простий вираз LINQ, щоб об'єднати всі List<string>предмети колекції в єдинуstring з роздільником символу?

Що робити, якщо колекція замість власних об'єктів string? Уявіть, що мені потрібно об'єднатися object.Name.


37
Чому linq, а не string.Join ()?
Алан

14
string.Join краще, але я думаю, що linq робить ваш код веселим, ось чому!
Алі Ерьоз

14
String.Join краще, оскільки він використовує StringBuilder і уникає первинного виконання O (n ^ 2) повторного конкатенації.
Кеннет Беленький

1
проблеми з продуктивністю за допомогою LINQ?
PreguntonCojoneroCabrón

Відповіді:


524

Використовуючи LINQ, це має працювати;

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

опис класу:

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

Використання:

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

    }
}

І ось найкраще :)

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

40
Час O (n ^ 2) вражає знову.
Кеннет Беленький

2
Якщо ви не можете бачити метод агрегування, вам потрібно додати за допомогою System.Linq;
Седрик Гільємет

6
Проблема полягає в тому, що вище метод LinQ не працює з порожнім або одноелементним списком.
Олександр

2
він викине InvalidOperationException у випадку, якщо елементи порожні.
2xMax

10
чому б не просто використовувати string.join? Будь ласка, прийміть відповідь Седату, щоб хтось, хто поспішав, не обирав це рішення, коли Седат найкращий вибір.
Скічан

966

У .NET 4.0 або новіших версіях:

String.Join(delimiter, list);

є достатнім.


91
Я всі за рішення LINQ, але це більш ефективно, ніж LINQ та метод Aggregate ().
andleer

17
набагато чистіше! чудово працював для мене! string.Join (",", accs.Select (x => x.AccountID) .ToArray ()),
m4tt1mus

32
@KonstantinSalavatov Я опублікував свою відповідь ще до того, як OP уточнив, що це повинно бути в LINQ. Це все ще цілком справедливо для тих, хто стикається з цією відповіддю, шукаючи рішення "не обов'язково-LINQ" в Google. Стосовно цієї відповіді "не корисно" в цьому контексті несправедливо.
Седат Капаноглу

7
Це також можна використовувати для речей, крім List <String>s, і буде викликати метод ToString ().
Кіан

не працює, якщо це запит до бази даних. Він працює лише на пам'ять.
alansiqueira27

124

Це для рядкового масиву:

string.Join(delimiter, array);

Це для списку <string>:

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

І це для списку користувацьких об’єктів:

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

25
String.Join має перевантаження, яка приймає IEnumerable, тому вам не потрібен дзвінок ToArray ()
arolson101

9
Майте на увазі, що безліч перевантажень існує лише в 4.0 або новіших версіях. Якщо ви використовуєте старішу версію, вам все одно знадобиться ToArray ().
Ракуен42

2
Ах! Останнє перевантаження було тим, кого я шукав. Я знав, що повинен бути спосіб витягти конкретну властивість. :)
Майк Девенні

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

Хороше питання. Я використовував

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

Це не LINQ, але він працює.


Чому потрібно дзвонити .ToArray ()?
Ε Г І І І О

Оскільки ще в погані дні 2009 року, у string.Join не було розширення, яке б прийняло IEnumerable.
Якоб Проффіт


7

Я думаю, що якщо ви визначите логіку в методі розширення, код буде набагато читабельнішим:

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

Ви можете просто використовувати:

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

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

Щасливого кодування!


3

Я зробив це за допомогою LINQ:

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

string joinedString = string.Join(",", oCSP.Select(p => p.ProductName));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.