Перетворити список у рядок у C #


184

Як перетворити список у рядок у C #?

Коли я виконую toStringна об'єкті List, я отримую:

System.Collections.Generic.List`1 [System.String]


1
Список - це колекція, як має виглядати цей рядок?
Марко

Ви можете спробувати будь-який із трьох згаданих тут способів .
RBT

Відповіді:


365

Можливо, ви намагаєтесь це зробити

string combindedString = string.Join( ",", myList.ToArray() );

Ви можете замінити "," тим, що хочете розділити елементи в списку на.

Редагувати : Як згадується в коментарях, ви також можете це зробити

string combindedString = string.Join( ",", myList);

Довідка:

Join<T>(String, IEnumerable<T>) 
Concatenates the members of a collection, using the specified separator between each member.

4
ти маєш на увазі рядок combindedString = string.Join (",", myList.ToArray ());
побачимо

2
Аргумент '2': неможливо перетворити з 'System.Collections.Generic.List <string>' в 'string []'
Ash

9
Я використовував це недавно, він працює - просто опустіть .ToArray ()
Адріан К

3
@AdrianK ви праві, тому що .Net 4.0 додав можливість передавати будь-яку IEnumerable <string>. Однак 4.0 вийшов у квітні 2010 року, перш ніж це питання та відповідь були опубліковані, тож, можливо, люди просто ще не знали про нього (крім кількох внизу нижче)
Ендрю Штайц

Для vb.net, Dim comindedString As String = String.Join (",", myList.ToArray ())
PartTimeNerd

55

Я збираюся зі своїм почуттям кишечника і припускаю, що ви хочете об'єднати результат виклику ToStringкожного елемента списку.

var result = string.Join(",", list.ToArray());

16

Ви можете використовувати string.Join:

List<string> list = new List<string>()
{
    "Red",
    "Blue",
    "Green"
};

string output = string.Join(Environment.NewLine, list.ToArray());    
Console.Write(output);

Результатом буде:

Red    
Blue    
Green

Як альтернативу Environment.NewLineви можете замінити його на рядковий розділовий рядок на ваш вибір.


14

Якщо ви хочете щось трохи складніше, ніж просте приєднання, ви можете використовувати LINQ, наприклад

var result = myList.Aggregate((total, part) => total + "(" + part.ToLower() + ")");

Візьмемо ["A", "B", "C"] і отримаємо "(a) (b) (c)"


1
Використовуйте Aggregate з насінням як перший параметр, щоб уникнути викидання InvalidOperationException для порожніх колекцій.
Хуаканача

13

String.Join(" ", myList)або String.Join(" ", myList.ToArray()). Перший аргумент - це роздільник між підрядками.

var myList = new List<String> { "foo","bar","baz"};
Console.WriteLine(String.Join("-", myList)); // prints "foo-bar-baz"

Залежно від вашої версії .NET, можливо, вам доведеться спочатку використовувати ToArray () у списку.


9

У вас є List<string>- так що, якщо ви хочете, щоб вони були об'єднані, щось подібне

string s = string.Join("", list);

буде працювати (як мінімум у .NET 4.0). Перший параметр - роздільник. Таким чином, ви також можете обмежувати комами тощо.

Ви також можете поглянути на використання StringBuilder для запуску конкатенацій, а не формування списку.


8

.ToString()Метод для посилальних типів , як правило , вирішує повернутися доSystem.Object.ToString() , якщо не перевизначити його в похідному типі (можливо , з використанням методів розширення для вбудованих типів). Типовою поведінкою для цього методу є виведення імені типу, на який він викликається. Тож те, що ти бачиш, - це очікувана поведінка.

Ви можете спробувати щось подібне, string.Join(", ", myList.ToArray());щоб досягти цього. Це додатковий крок, але його можна ввести в метод розширення, System.Collections.Generic.List<T>щоб зробити його трохи простіше. Щось на зразок цього:

public static class GenericListExtensions
{
    public static string ToString<T>(this IList<T> list)
    {
        return string.Join(", ", list);
    }
}

(Зауважте, що це вільний і неперевірений код. У мене зараз компілятор не підходить. Тому ви хочете трохи експериментувати з ним.)


він працює, коли я називаю це не ToString або виконую його загальним параметром. Але мені подобається ваша ідея використання методу розширення :)
IAdapter

4

Важко сказати, але, можливо, ти шукаєш щось на кшталт:

var myString = String.Join(String.Empty, myList.ToArray());

Це буде неявно викликати метод ToString () для кожного з елементів у списку та об'єднати їх.


1
String.Concat()краще досягти того самого.
Джефф Меркадо


2

Якщо ви хочете перетворити елементи зі списку у велику довгу рядок, зробіть це: String.Join("", myList) . Деякі старіші версії фреймворку не дозволяють передавати IEnumerable як другий параметр, тому вам може знадобитися перетворити свій список в масив, зателефонувавши .ToArray ().


2

Пряма відповідь на ваше запитання: String.Join як згадували інші.

Однак якщо вам потрібні деякі маніпуляції, ви можете скористатися Aggregate:

List<string> employees = new List<string>();
employees.Add("e1");
employees.Add("e2");
employees.Add("e3");

string employeesString = "'" + employees.Aggregate((x, y) => x + "','" + y) + "'";
Console.WriteLine(employeesString);
Console.ReadLine();

1
у виробничому коді переконайтесь, що у вашому списку є будь-який елемент, інакше він викине виключення.
AZ_

1

Цей метод допоміг мені, коли я намагався отримати дані з текстового файлу та зберегти їх у масиві, а потім призначити їх доступним рядком.

string[] lines = File.ReadAllLines(Environment.CurrentDirectory + "\\Notes.txt");  
string marRes = string.Join(Environment.NewLine, lines.ToArray());

Сподіваємось, хтось може допомогти !!!!



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.