Konwertuj listę na ciąg w C #

184

Jak przekonwertować listę na ciąg w C #?

Kiedy wykonuję toStringna obiekcie List, otrzymuję:

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

IAdapter
źródło
1
Lista to kolekcja, jak powinien wyglądać ten ciąg?
Marko
Możesz wypróbować jeden z trzech wymienionych tutaj sposobów .
RBT

Odpowiedzi:

365

Może próbujesz to zrobić

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

Możesz zastąpić „,” tym, przez co chcesz podzielić elementy na liście.

Edycja : Jak wspomniano w komentarzach, możesz również zrobić

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

Odniesienie:

Join<T>(String, IEnumerable<T>) 
Concatenates the members of a collection, using the specified separator between each member.
Øyvind Bråthen
źródło
4
masz na myśli string combindedString = string.Join (",", myList.ToArray ());
piła
2
Argument „2”: nie można przekonwertować z „System.Collections.Generic.List <string>” na „string []”
Ash
9
Użyłem tego niedawno, to działa - po prostu pomiń .ToArray ()
Adrian K
3
@AdrianK masz rację, ponieważ .Net 4.0 dodał możliwość przekazywania w dowolnym IEnumerable <ciąg>. Jednak wersja 4.0 została wydana w kwietniu 2010 r., Zanim opublikowano to pytanie i odpowiedź, więc być może ludzie tutaj nie byli jeszcze tego świadomi (z wyjątkiem kilku poniżej)
Andrew Steitz,
W przypadku vb.net Dim combindedString As String = String.Join (",", myList.ToArray ())
PartTimeNerd
55

Idę z przeczuciem i zakładam, że chcesz połączyć wynik wywołania ToStringkażdego elementu listy.

var result = string.Join(",", list.ToArray());
ChaosPandion
źródło
16

Możesz użyć string.Join:

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

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

Wynik byłby:

Red    
Blue    
Green

Alternatywnie Environment.NewLinemożesz zastąpić go wybranym przez Ciebie separatorem linii opartym na łańcuchach.

Eandersson
źródło
14

Jeśli chcesz czegoś nieco bardziej złożonego niż proste połączenie, możesz użyć LINQ np

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

Weźmie [„A”, „B”, „C”] i wyprodukuje „(a) (b) (c)”

James Gaunt
źródło
1
Użyj Aggregate z ziarnem jako pierwszym parametrem, aby uniknąć zgłaszania wyjątku InvalidOperationException dla pustych kolekcji.
Huacanacha,
13

String.Join(" ", myList)lub String.Join(" ", myList.ToArray()). Pierwszy argument to separator między podciągami.

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

W zależności od wersji .NET może być konieczne użycie najpierw ToArray () na liście.

Markus Johnsson
źródło
9

Masz List<string>- więc jeśli chcesz je połączyć, coś w tym rodzaju

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

działałoby (przynajmniej w .NET 4.0). Pierwszym parametrem jest separator. Możesz więc także wstawić przecinek itp.

Możesz także rozważyć użycie StringBuilder do wykonywania konkatenacji zamiast tworzenia listy.

Marc Gravell
źródło
8

.ToString()Metoda dla typów referencyjnych zwykle postanawia wrócić doSystem.Object.ToString() , jeśli nie zastępują go w rodzaju pochodzącej (ewentualnie przy użyciu metody rozszerzenie dla typów wbudowanych). Domyślnym zachowaniem dla tej metody jest wyświetlenie nazwy typu, na który jest wywoływana. Widzisz więc oczekiwane zachowanie.

Możesz spróbować czegoś takiego, string.Join(", ", myList.ToArray());aby to osiągnąć. To dodatkowy krok, ale można go zastosować w metodzie rozszerzenia, System.Collections.Generic.List<T>aby było trochę łatwiej. Coś takiego:

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

(Zauważ, że jest to kod z wolnej ręki i nie przetestowany. W tej chwili nie mam pod ręką kompilatora. Więc będziesz chciał z nim trochę poeksperymentować).

David
źródło
działa, gdy nazywam go nie ToString lub wykonuję go z parametrem ogólnym. Ale podoba mi się twój pomysł użycia metody rozszerzenia :)
IAdapter
4

Trudno powiedzieć, ale może szukasz czegoś takiego:

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

Spowoduje to niejawne wywołanie metody ToString () na każdym elemencie na liście i połączenie ich.

Daniel Schaffer
źródło
1
String.Concat()osiągnie to samo lepiej.
Jeff Mercado
2

Jeśli szukasz kolejno pozycje w liście do wielkiego długiego łańcucha, to zrobić: String.Join("", myList). Niektóre starsze wersje frameworka nie pozwalają na przekazanie IEnumerable jako drugiego parametru, więc może być konieczne przekonwertowanie listy na tablicę poprzez wywołanie funkcji .ToArray ().

mattmc3
źródło
2

Bezpośrednia odpowiedź na twoje pytanie brzmi String.Join jak mówili inni.

Jeśli jednak potrzebujesz pewnych manipulacji, możesz użyć 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
źródło
1
w kodzie produkcyjnym upewnij się, że twoja lista ma jakiś element, w przeciwnym razie spowoduje to wyjątek.
AZ_
1

Ta metoda pomogła mi przy próbie pobrania danych z pliku tekstowego i zapisania ich w tablicy, a następnie przypisania do zmiennej łańcuchowej.

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

Mam nadzieję, że może komuś pomóc !!!!

PatsonLeaner
źródło
0

Wydaje mi się, że to działa.

var combindedString = new string(list.ToArray());
mutuma
źródło
0

wszystkie powyższe odpowiedzi NIE działają dla zagnieżdżonych list.

Andreas Otto
źródło