Преобразовать список в строку в C #

185

Как мне преобразовать список в строку в C #?

Когда я выполняю toStringобъект List, я получаю:

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

IAdapter
источник
1
Список - это коллекция, как должна выглядеть эта строка?
Марко
Вы можете попробовать любой из трех способов, упомянутых здесь .
RBT

Ответы:

367

Может быть, вы пытаетесь сделать

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 ()
Adrian K
3
@AdrianK вы правы, потому что в .Net 4.0 добавлена ​​возможность передавать любой IEnumerable <string>. Однако 4.0 был выпущен в апреле 2010 года, до того, как этот вопрос и ответ были опубликованы, так что, возможно, люди здесь просто еще не знали об этом (кроме нескольких ниже)
Эндрю Стейтц,
Для vb.net, Dim combindedString As String = String.Join (",", myList.ToArray ())
PartTimeNerd
55

Я собираюсь пойти с моим внутренним чувством и предположить, что вы хотите объединить результат вызова ToStringкаждого элемента списка.

var result = string.Join(",", list.ToArray());
ChaosPandion
источник
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вы можете заменить его на строковый разделитель по вашему выбору.

eandersson
источник
14

Если вы хотите что-то более сложное, чем простое соединение, вы можете использовать LINQ, например:

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

Возьму ["A", "B", "C"] и произведу "(a) (b) (c)"

Джеймс Гонт
источник
1
Используйте Aggregate with seed в качестве первого параметра, чтобы избежать создания исключения InvalidOperationException для пустых коллекций.
Huacanacha
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()достигнет того же самого лучше.
Джефф Меркадо
@JeffMercado alexjamesbrown.com/blog/development/…
Кевман
2

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

mattmc3
источник
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();
LCJ
источник
1
в рабочем коде убедитесь, что в вашем списке есть какой-либо элемент, иначе он выдаст исключение.
AZ_
1

Этот метод помог мне при попытке получить данные из текстового файла и сохранить их в массиве, а затем назначить их доступной строке.

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

Надеюсь, кто-то может помочь !!!!

PatsonLeaner
источник
0

Кажется, это работает для меня.

var combindedString = new string(list.ToArray());
mutuma
источник
0

Все ответы выше НЕ работают для вложенных списков.

Андреас Отто
источник